plures-mcp 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  An MCP server that gives any AI agent a human in the loop: an `ask_humans` tool that sends a decision to ID verified people and returns their consensus before the agent acts. Built on [Plures](https://plures.si).
4
4
 
5
+ [![Plures MCP server](https://mcprush.com/badge/plures-mcp/card.svg)](https://mcprush.com/to/plures-mcp?ref=badge)
6
+
5
7
  Works with Claude Desktop, Claude Code, Cursor, VS Code, and agent frameworks that support MCP (OpenAI Agents SDK, LangChain, Vercel AI SDK and more).
6
8
 
7
9
  ## Set up
@@ -28,7 +30,7 @@ A `pk_test_` key answers instantly with a simulated result (always the first opt
28
30
 
29
31
  **`ask_humans`**: send a judgment call to verified people.
30
32
 
31
- Set `route: "team"` to send a decision straight to your own team instead of verified people (for confidential or policy calls), `team` to pick one of your named teams, `team_votes` to have several of them vote, and `category` to let your routing rules decide. Live, each internal vote is $0.05.
33
+ Set `route: "team"` to send a decision straight to your own team instead of verified people (for money and account decisions, and confidential or policy calls), `team` to pick one of your named teams, `team_votes` to have several of them vote, and `category` to let your routing rules decide. Live, each internal vote is $0.05.
32
34
  - `question` (required): what people should decide, answerable from the context alone
33
35
  - `options` (required): 2 to 8 possible answers
34
36
  - `context`: the material to judge, as plain text
@@ -48,7 +50,9 @@ Each result tells the agent the answer, how many people agreed and whether it is
48
50
 
49
51
  ## When agents should use it
50
52
 
51
- The server tells the agent to ask people before acting on judgment calls where a mistake is costly: a customer's tone or intent, a refund or payment, whether an invoice, listing or document matches, a moderation edge case. Not for anything it can check with code or a lookup.
53
+ The server tells the agent to ask verified people before acting on judgment calls where a mistake is costly: whether an AI answer is correct and on policy, which of two model responses is better, a customer's tone or intent, whether a listing, document or screenshot matches, a moderation edge case. Not for anything it can check with code or a lookup.
54
+
55
+ Money and account decisions (refunds, payments, invoices, payouts, account access) go to your own team: the agent sends them with `route: "team"`, or your routing rules can match them by `category`.
52
56
 
53
57
  Tasks are shown to strangers, so the agent is told not to include secrets or more personal data than the decision needs.
54
58
 
package/dist/index.js CHANGED
@@ -5,12 +5,12 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
  import { z } from "zod";
7
7
  import { Plures, PluresError } from "plures";
8
- var VERSION = "1.5.0";
8
+ var VERSION = "1.5.1";
9
9
  var KEY = process.env.PLURES_API_KEY;
10
10
  var plures = KEY ? new Plures(KEY, { baseUrl: process.env.PLURES_BASE_URL }) : null;
11
11
  var MAX_WAIT = 240;
12
12
  var server = new McpServer({ name: "plures", version: VERSION }, {
13
- instructions: "Plures sends a decision to ID verified people, who answer independently, and returns their consensus. Use ask_humans before you act on a judgment call you are not sure about, where a wrong call costs money, trust or safety: reading a customer's tone or intent, approving a refund or payment, checking that an invoice, listing or document matches, moderating an edge case, or confirming a fact that needs human eyes. Don't use it for things you can check with code or a lookup. Act on the answer when agreement is 1; below that, treat it as uncertain and escalate or ask for more verifiers. For decisions only the company's own people should make (confidential data, policy calls, anything regulated), set route to team to send it straight to the developer's team instead of verified people. When the user asks to map their app or agent for Plures, call get_mapping_guide, read the code the way it says, then call submit_agent_map. Never put source code, secrets or customer data in a map."
13
+ instructions: "Plures sends a decision to ID verified people, who answer independently, and returns their consensus. Use ask_humans before you act on a judgment call you are not sure about, where a wrong call costs trust or safety: grading whether an AI answer is correct, safe and on policy, picking the better of two model responses, reading a customer's tone or intent, checking that a listing, document or screenshot matches what it claims, moderating an edge case, or confirming a fact that needs human eyes. Don't use it for things you can check with code or a lookup. Act on the answer when agreement is 1; below that, treat it as uncertain and escalate or ask for more verifiers. Money and account decisions (refunds, payments, invoices, payouts, account access) belong to the company's own people: set route to team for those, and for anything confidential, a policy call or regulated, so it goes straight to the developer's team instead of verified people. When the user asks to map their app or agent for Plures, call get_mapping_guide, read the code the way it says, then call submit_agent_map. Never put source code, secrets or customer data in a map."
14
14
  });
15
15
  var TEST_NOTE = "TEST MODE: this answer is simulated; no person saw the question. It always picks the first option, so don't act on it. Use a live key for real answers.";
16
16
  var fmt = (t) => {
@@ -76,11 +76,11 @@ var progressFor = (extra, total) => {
76
76
  var result = { task_id: z.string(), status: z.string(), mode: z.string(), route: z.string(), decided_by: z.string().nullable(), with_team: z.boolean(), answer: z.string().nullable(), label: z.string().nullable(), agreement: z.number().nullable(), answers: z.number(), votes: z.record(z.number()) };
77
77
  server.registerTool("ask_humans", {
78
78
  title: "Ask verified humans",
79
- description: "Send a decision to ID verified people before you act on it. Several people answer independently, each confirmed with Face ID, and you get back the consensus answer and how strongly they agreed. Use it for judgment calls where being wrong is costly: tone and intent, refunds and payments, whether two things match, moderation edge cases. Write the question so a stranger can answer it from the context alone, and never include secrets or more personal data than the decision needs. Live keys use prepaid credit at $0.20 per answer (clips cost more by length), or $0.05 per internal vote with route team; test keys are free and simulated.",
79
+ description: "Send a decision to ID verified people before you act on it. Several people answer independently, each confirmed with Face ID, and you get back the consensus answer and how strongly they agreed. Use it for judgment calls where being wrong is costly: evals of AI output, tone and intent, whether two things match, moderation edge cases. Send refunds, payments and other money calls with route team. Write the question so a stranger can answer it from the context alone, and never include secrets or more personal data than the decision needs. Live keys use prepaid credit at $0.20 per answer (clips cost more by length), or $0.05 per internal vote with route team; test keys are free and simulated.",
80
80
  inputSchema: {
81
81
  question: z.string().min(3).max(1e3).describe('What people should decide, e.g. "Is this customer upset?"'),
82
82
  options: z.array(z.string().min(1).max(200)).min(2).max(8).describe('2 to 8 possible answers, e.g. ["Yes", "No"]'),
83
- context: z.string().max(2e4).optional().describe("The material to judge, as plain text: the message, the invoice lines, the listing"),
83
+ context: z.string().max(2e4).optional().describe("The material to judge, as plain text: the AI answer and the policy it should follow, the message, the listing"),
84
84
  image_url: z.string().url().optional().describe("An https image shown with the question"),
85
85
  audio_url: z.string().url().optional().describe("An https recording people listen to in full before answering, such as a call your voice agent handled. Up to 3 minutes; needs media_seconds"),
86
86
  video_url: z.string().url().optional().describe("An https video (MP4) people watch in full before answering. Up to 3 minutes; needs media_seconds. Not with audio_url"),
@@ -88,7 +88,7 @@ server.registerTool("ask_humans", {
88
88
  sensitive: z.boolean().optional().describe("Set true for violent, graphic or disturbing content, so only people who opted in see it, behind a warning"),
89
89
  instructions: z.string().max(2e3).optional().describe("Short guidance shown under the question"),
90
90
  verifiers: z.union([z.literal(1), z.literal(3), z.literal(5), z.literal(7), z.literal(9)]).optional().describe("How many people answer. Default 3; use 5 for higher stakes"),
91
- route: z.enum(["verifiers", "team"]).optional().describe("verifiers (default) asks ID verified people first. team sends it straight to the developer's own people, for confidential or policy decisions; $0.05 per internal vote live"),
91
+ route: z.enum(["verifiers", "team"]).optional().describe("verifiers (default) asks ID verified people first. team sends it straight to the developer's own people, for money and account decisions and confidential or policy calls; $0.05 per internal vote live"),
92
92
  category: z.string().max(64).optional().describe(`A label the developer's routing rules match on, like "refunds"; the rule may choose the route and team`),
93
93
  team: z.string().max(40).optional().describe(`The name of one of the developer's teams, like "Finance", to decide instead of the main team`),
94
94
  team_votes: z.number().int().min(1).max(10).optional().describe("With route team: how many people on the team vote; the majority decides"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plures-mcp",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "mcpName": "io.github.plureslabs/plures",
5
5
  "description": "MCP server for Plures: lets any AI agent ask ID verified people to check a decision before it acts.",
6
6
  "keywords": [