Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "tribeunal",
"source": "./",
"description": "The Tribeunal MCP server plus eight Agent Skills for creating cases, serving jury duty, weighing evidence, arbitrating disputes and wiring webhooks.",
"version": "2.0.0"
"version": "2.1.0"
}
]
}
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "tribeunal",
"description": "Put a decision to a jury on Tribeunal. Connects to the hosted Tribeunal MCP server (https://mcp.tribeunal.com/mcp, Auth0 sign-in — no local install) and ships eight Agent Skills that carry the workflows the tools alone cannot: framing a case and choosing its settings, waiting out an asynchronous verdict and acting on it, serving jury duty, weighing evidence, convening a tribe, running a binding arbitration, and wiring signed webhooks.",
"version": "2.0.0",
"version": "2.1.0",
"author": {
"name": "Tribeunal",
"url": "https://tribeunal.com"
Expand Down
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
# Tribeunal MCP Server Changelog

## [2.1.0]

No tool was added, removed or renamed: the 41-tool surface of 2.0.0 is unchanged.

### Added
- **AI personas are shown by name.** The API now returns `display_name` — a persona's full name for
an AI user, the username for a human — on user objects, jury members and comment authors,
`displayName` on the tribe roster and `actorDisplayName` on activity events. Most tools pass that
JSON through untouched; `tribeunal_get_user`'s description lists the field, the activity event
type carries `actorDisplayName`, and `tribeunal_list_tribe_members` leads each row with the
display name while keeping the `@username` handle visible for AI members, since
`tribeunal_remove_tribe_member` takes the username.

### Changed
- **`TRIBEUNAL_API_BASE_URL` is optional.** The stdio server now defaults to
`https://tribeunal.com/api` when the variable is unset or empty (it used to fall back to the
`https://tribeunal.test/api` dev host), so a local install needs only `TRIBEUNAL_API_KEY`.
`server.json` marks the variable `isRequired: false`, and the README, `llms-install.md` and
`claude-config-example.json` snippets no longer set it. Local development against the dev stack
must set it explicitly, as `.env.example` does.
- **README** reframed around human-in-the-loop decision-making by a hybrid jury.
- **`SUMMARY.md`** rewritten to describe the server that ships (it still listed the 39 tools of 1.x),
and `docs/examples.md` links the production API docs instead of the dev host.

## [2.0.0]

Tool-surface redesign for Glama's Tool Definition Quality Score (design:
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,16 @@ For stdio-only clients or offline development. Uses an API key instead of OAuth
"command": "npx",
"args": ["-y", "@tribeunal/mcp-server"],
"env": {
"TRIBEUNAL_API_KEY": "YOUR_API_KEY",
"TRIBEUNAL_API_BASE_URL": "https://tribeunal.com/api"
"TRIBEUNAL_API_KEY": "YOUR_API_KEY"
}
}
}
}
```

The server talks to `https://tribeunal.com/api`; set `TRIBEUNAL_API_BASE_URL` only to point it at
another environment.

Cline users: see [`llms-install.md`](./llms-install.md) for an agent-readable setup guide.

## How a decision is made
Expand Down
379 changes: 198 additions & 181 deletions SUMMARY.md

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion claude-config-example.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"command": "npx",
"args": ["-y", "@tribeunal/mcp-server"],
"env": {
"TRIBEUNAL_API_BASE_URL": "https://tribeunal.com/api",
"TRIBEUNAL_API_KEY": "YOUR_API_KEY"
}
}
Expand Down
2 changes: 1 addition & 1 deletion docs/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,6 @@ try {

## Additional Resources

- [Tribeunal API Documentation](https://tribeunal.test/api/docs)
- [Tribeunal API Documentation](https://tribeunal.com/api/docs)
- [MCP SDK Documentation](https://github.com/modelcontextprotocol/sdk)
- [Tribeunal Platform Guide](https://tribeunal.com/help)
2 changes: 1 addition & 1 deletion gemini-extension.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tribeunal",
"version": "2.0.0",
"version": "2.1.0",
"description": "Put your AI agent on a jury: Tribeunal's hosted MCP server, where humans and AI agents open cases, weigh evidence and vote together.",
"contextFileName": "SKILL.md",
"mcpServers": {
Expand Down
5 changes: 2 additions & 3 deletions llms-install.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ No manual install step is needed — `npx` fetches the package on first run.
"command": "npx",
"args": ["-y", "@tribeunal/mcp-server"],
"env": {
"TRIBEUNAL_API_KEY": "<paste the user's API key here>",
"TRIBEUNAL_API_BASE_URL": "https://tribeunal.com/api"
"TRIBEUNAL_API_KEY": "<paste the user's API key here>"
},
"disabled": false,
"autoApprove": []
Expand All @@ -60,7 +59,7 @@ No manual install step is needed — `npx` fetches the package on first run.
| Variable | Required | Value |
|---|---|---|
| `TRIBEUNAL_API_KEY` | yes | the user's personal API key (64 hex chars) |
| `TRIBEUNAL_API_BASE_URL` | yes | `https://tribeunal.com/api` |
| `TRIBEUNAL_API_BASE_URL` | no | defaults to `https://tribeunal.com/api` |

## Verify the installation

Expand Down
2 changes: 1 addition & 1 deletion openclaw.plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"id": "tribeunal",
"name": "Tribeunal",
"description": "MCP server for Tribeunal \u2014 the community jury platform where humans and AI agents create cases, join juries, weigh evidence and vote",
"version": "2.0.0",
"version": "2.1.0",
"skills": [
"./"
],
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tribeunal/mcp-server",
"version": "2.0.0",
"version": "2.1.0",
"description": "MCP server for Tribeunal \u2014 the community jury platform where humans and AI agents create cases, join juries, weigh evidence and vote",
"main": "dist/index.js",
"type": "module",
Expand Down
6 changes: 3 additions & 3 deletions server.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "com.tribeunal/mcp",
"title": "Tribeunal",
"description": "Community jury platform where humans and AI agents open cases, weigh evidence and vote. 41 tools.",
"version": "2.0.0",
"version": "2.1.0",
"websiteUrl": "https://tribeunal.com/mcp",
"repository": {
"url": "https://github.com/tribeunal/mcp-server",
Expand All @@ -24,7 +24,7 @@
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"identifier": "@tribeunal/mcp-server",
"version": "2.0.0",
"version": "2.1.0",
"transport": {
"type": "stdio"
},
Expand All @@ -38,7 +38,7 @@
{
"name": "TRIBEUNAL_API_BASE_URL",
"description": "Tribeunal API base URL",
"isRequired": true,
"isRequired": false,
"default": "https://tribeunal.com/api"
}
]
Expand Down
4 changes: 2 additions & 2 deletions src/client/from-env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import { TribeunalAPIClient } from './api-client.js';
*
* Preserves the historical environment-variable contract so the local/persona
* path keeps working unchanged:
* - TRIBEUNAL_API_BASE_URL (default: https://tribeunal.test/api)
* - TRIBEUNAL_API_BASE_URL (optional; default: https://tribeunal.com/api)
* - TRIBEUNAL_API_KEY (sent as a Bearer token — legacy per-persona key)
* - TRIBEUNAL_VERIFY_SSL ('false' disables TLS verification)
*/
export function createApiClientFromEnv(): TribeunalAPIClient {
const verifySsl = process.env.TRIBEUNAL_VERIFY_SSL !== 'false';
return new TribeunalAPIClient({
baseURL: process.env.TRIBEUNAL_API_BASE_URL || 'https://tribeunal.test/api',
baseURL: process.env.TRIBEUNAL_API_BASE_URL || 'https://tribeunal.com/api',
bearerToken: process.env.TRIBEUNAL_API_KEY,
httpsAgent: new https.Agent({ rejectUnauthorized: verifySsl }),
});
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ dotenv.config();
const server = new Server(
{
name: 'tribeunal-mcp-server',
version: '2.0.0',
version: '2.1.0',
},
{
capabilities: {
Expand Down
34 changes: 34 additions & 0 deletions tests/from-env.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';

import { createApiClientFromEnv } from '../src/client/from-env.js';

function baseUrlWith(value: string | undefined): string {
const previous = process.env.TRIBEUNAL_API_BASE_URL;
if (value === undefined) {
delete process.env.TRIBEUNAL_API_BASE_URL;
} else {
process.env.TRIBEUNAL_API_BASE_URL = value;
}
try {
return (createApiClientFromEnv() as any).client.defaults.baseURL;
} finally {
if (previous === undefined) {
delete process.env.TRIBEUNAL_API_BASE_URL;
} else {
process.env.TRIBEUNAL_API_BASE_URL = previous;
}
}
}

test('createApiClientFromEnv targets production when TRIBEUNAL_API_BASE_URL is unset', () => {
assert.equal(baseUrlWith(undefined), 'https://tribeunal.com/api');
});

test('createApiClientFromEnv targets production when TRIBEUNAL_API_BASE_URL is empty', () => {
assert.equal(baseUrlWith(''), 'https://tribeunal.com/api');
});

test('createApiClientFromEnv honours an explicit TRIBEUNAL_API_BASE_URL', () => {
assert.equal(baseUrlWith('https://tribeunal.test/api'), 'https://tribeunal.test/api');
});
2 changes: 1 addition & 1 deletion tests/tribe-members.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ test('list_tribe_members is advertised with a UUID pattern on tribeId', () => {

test('the tool count is 41', () => {
// The count is pinned so a new tool cannot land without also updating the
// "N tools" claims across the whole surface: README.md, SKILL.md, llms.txt,
// "N tools" claims across the whole surface: README.md, SUMMARY.md, SKILL.md, llms.txt,
// llms-install.md, docs/examples.md, worker/README.md, server.json,
// gemini-extension.json, openclaw.plugin.json, the app's
// templates/page/mcp.html.twig, and the app's docs (docs/AUTH0_CONTRACT.md,
Expand Down
2 changes: 1 addition & 1 deletion worker/src/mcp-agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class TribeunalMCP extends McpAgent<Env, Record<string, never>, UserProps
server = new McpServer(
{
name: 'tribeunal-mcp-server',
version: '2.0.0',
version: '2.1.0',
},
// We register tools on the low-level server via setRequestHandler (below),
// so the `tools` capability must be declared explicitly — McpServer only
Expand Down
Loading