Runner /load now accepts gitUrl, npxPackage, or sourcePath. It handles git clone and npm install internally. Broker no longer needs shared volume for source extraction — just tells the runner what to fetch. CLI mesh_mcp_deploy now supports npx_package as a third source type. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
976 lines
29 KiB
TypeScript
976 lines
29 KiB
TypeScript
/**
|
||
* MCP tool definitions exposed to Claude Code.
|
||
*
|
||
* Mirror the claude-intercom tool surface: send_message, list_peers,
|
||
* check_messages, set_summary, set_status. Tools return "not
|
||
* connected" errors until 15b wires the WS client.
|
||
*/
|
||
|
||
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
||
|
||
export const TOOLS: Tool[] = [
|
||
{
|
||
name: "send_message",
|
||
description:
|
||
"Send a message to a peer in one of your joined meshes. `to` can be a peer display name (resolved via list_peers), hex pubkey, @group, `#channel`, or `*` for broadcast. `priority` controls delivery: `now` bypasses busy gates, `next` waits for idle (default), `low` is pull-only.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
to: {
|
||
oneOf: [
|
||
{ type: "string", description: "Peer name, pubkey, @group" },
|
||
{ type: "array", items: { type: "string" }, description: "Multiple targets" },
|
||
],
|
||
description: "Single target or array of targets",
|
||
},
|
||
message: { type: "string", description: "Message text" },
|
||
priority: {
|
||
type: "string",
|
||
enum: ["now", "next", "low"],
|
||
description: "Delivery priority (default: next)",
|
||
},
|
||
},
|
||
required: ["to", "message"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_peers",
|
||
description:
|
||
"List peers across all joined meshes. Shows name, mesh, status (idle/working/dnd), and current summary.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
mesh_slug: {
|
||
type: "string",
|
||
description: "Only list peers in this mesh (optional)",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
{
|
||
name: "message_status",
|
||
description:
|
||
"Check the delivery status of a sent message. Shows whether each recipient received it.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: {
|
||
type: "string",
|
||
description: "Message ID (returned by send_message)",
|
||
},
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
{
|
||
name: "check_messages",
|
||
description:
|
||
"Pull any undelivered messages from the broker. Normally messages arrive via push; use this to drain the queue after being offline.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "set_summary",
|
||
description:
|
||
"Set a 1–2 sentence summary of what you're working on. Visible to other peers.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
summary: { type: "string", description: "1-2 sentence summary" },
|
||
},
|
||
required: ["summary"],
|
||
},
|
||
},
|
||
{
|
||
name: "set_status",
|
||
description:
|
||
"Manually override your status. `dnd` blocks everything except `now`-priority messages.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
status: {
|
||
type: "string",
|
||
enum: ["idle", "working", "dnd"],
|
||
description: "Your status",
|
||
},
|
||
},
|
||
required: ["status"],
|
||
},
|
||
},
|
||
{
|
||
name: "set_visible",
|
||
description:
|
||
"Control your visibility in the mesh. When hidden, you won't appear in list_peers and won't receive broadcasts — but direct messages still reach you.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
visible: {
|
||
type: "boolean",
|
||
description: "true to be visible (default), false to hide",
|
||
},
|
||
},
|
||
required: ["visible"],
|
||
},
|
||
},
|
||
{
|
||
name: "set_profile",
|
||
description:
|
||
"Set your public profile — what other peers see about you. Avatar (emoji), title, bio, and capabilities list.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
avatar: {
|
||
type: "string",
|
||
description: "Emoji or URL for your avatar",
|
||
},
|
||
title: {
|
||
type: "string",
|
||
description: "Short role label (e.g. 'Frontend Lead', 'DevOps')",
|
||
},
|
||
bio: {
|
||
type: "string",
|
||
description: "One-liner about yourself",
|
||
},
|
||
capabilities: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "What you can help with",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
{
|
||
name: "join_group",
|
||
description:
|
||
"Join a group with an optional role. Other peers see your group membership in list_peers.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Group name (without @)" },
|
||
role: {
|
||
type: "string",
|
||
description: "Your role in the group (e.g. lead, member, observer)",
|
||
},
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
{
|
||
name: "leave_group",
|
||
description: "Leave a group.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Group name (without @)" },
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
|
||
// --- State tools ---
|
||
{
|
||
name: "set_state",
|
||
description:
|
||
"Set a shared state value visible to all peers in the mesh. Pushes a change notification.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
key: { type: "string" },
|
||
value: { description: "Any JSON value" },
|
||
},
|
||
required: ["key", "value"],
|
||
},
|
||
},
|
||
{
|
||
name: "get_state",
|
||
description: "Read a shared state value.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
key: { type: "string" },
|
||
},
|
||
required: ["key"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_state",
|
||
description: "List all shared state keys and values in the mesh.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Memory tools ---
|
||
{
|
||
name: "remember",
|
||
description:
|
||
"Store persistent knowledge in the mesh's shared memory. Survives across sessions.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
content: {
|
||
type: "string",
|
||
description: "The knowledge to remember",
|
||
},
|
||
tags: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Optional categorization tags",
|
||
},
|
||
},
|
||
required: ["content"],
|
||
},
|
||
},
|
||
{
|
||
name: "recall",
|
||
description: "Search the mesh's shared memory by relevance.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
query: { type: "string", description: "Search query" },
|
||
},
|
||
required: ["query"],
|
||
},
|
||
},
|
||
{
|
||
name: "forget",
|
||
description: "Remove a memory from the mesh's shared knowledge.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "Memory ID to forget" },
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
|
||
// --- File tools ---
|
||
{
|
||
name: "share_file",
|
||
description:
|
||
"Share a persistent file with the mesh. All current and future peers can access it. If `to` is specified, the file is E2E encrypted and only accessible to that peer (and you).",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
path: { type: "string", description: "Local file path to share" },
|
||
name: {
|
||
type: "string",
|
||
description: "Display name (defaults to filename)",
|
||
},
|
||
tags: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Tags for categorization",
|
||
},
|
||
to: {
|
||
type: "string",
|
||
description: "Peer display name or pubkey hex — if set, file is E2E encrypted for this peer only",
|
||
},
|
||
},
|
||
required: ["path"],
|
||
},
|
||
},
|
||
{
|
||
name: "get_file",
|
||
description: "Download a shared file to a local path.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "File ID" },
|
||
save_to: {
|
||
type: "string",
|
||
description: "Local path to save the file",
|
||
},
|
||
},
|
||
required: ["id", "save_to"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_files",
|
||
description: "List files shared in the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
query: { type: "string", description: "Search by name or tags" },
|
||
from: { type: "string", description: "Filter by uploader name" },
|
||
},
|
||
},
|
||
},
|
||
{
|
||
name: "file_status",
|
||
description: "Check who has accessed a shared file.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "File ID" },
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
{
|
||
name: "delete_file",
|
||
description: "Remove a shared file from the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "File ID" },
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
{
|
||
name: "grant_file_access",
|
||
description: "Grant a peer access to an E2E encrypted file you shared. You must be the owner.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
fileId: { type: "string", description: "File ID" },
|
||
to: { type: "string", description: "Peer display name or pubkey hex to grant access to" },
|
||
},
|
||
required: ["fileId", "to"],
|
||
},
|
||
},
|
||
|
||
// --- Vector tools ---
|
||
{
|
||
name: "vector_store",
|
||
description:
|
||
"Store an embedding in a per-mesh Qdrant collection. Auto-creates the collection on first use.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
collection: { type: "string", description: "Collection name" },
|
||
text: { type: "string", description: "Text to embed and store" },
|
||
metadata: {
|
||
type: "object",
|
||
description: "Optional metadata to attach",
|
||
},
|
||
},
|
||
required: ["collection", "text"],
|
||
},
|
||
},
|
||
{
|
||
name: "vector_search",
|
||
description: "Semantic search over stored embeddings in a collection.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
collection: { type: "string", description: "Collection name" },
|
||
query: { type: "string", description: "Search query text" },
|
||
limit: {
|
||
type: "number",
|
||
description: "Max results (default: 10)",
|
||
},
|
||
},
|
||
required: ["collection", "query"],
|
||
},
|
||
},
|
||
{
|
||
name: "vector_delete",
|
||
description: "Remove an embedding from a collection.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
collection: { type: "string", description: "Collection name" },
|
||
id: { type: "string", description: "Embedding ID to delete" },
|
||
},
|
||
required: ["collection", "id"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_collections",
|
||
description: "List vector collections in this mesh.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Graph tools ---
|
||
{
|
||
name: "graph_query",
|
||
description:
|
||
"Run a read-only Cypher query on the per-mesh Neo4j database.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
cypher: { type: "string", description: "Cypher MATCH query" },
|
||
},
|
||
required: ["cypher"],
|
||
},
|
||
},
|
||
{
|
||
name: "graph_execute",
|
||
description:
|
||
"Run a write Cypher query (CREATE, MERGE, DELETE) on the per-mesh Neo4j database.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
cypher: { type: "string", description: "Cypher write query" },
|
||
},
|
||
required: ["cypher"],
|
||
},
|
||
},
|
||
|
||
// --- Mesh Database tools ---
|
||
{
|
||
name: "mesh_query",
|
||
description:
|
||
"Run a SELECT query on the per-mesh shared database.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
sql: { type: "string", description: "SQL SELECT query" },
|
||
},
|
||
required: ["sql"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_execute",
|
||
description:
|
||
"Run DDL/DML on the per-mesh database (CREATE TABLE, INSERT, UPDATE, DELETE).",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
sql: { type: "string", description: "SQL statement" },
|
||
},
|
||
required: ["sql"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_schema",
|
||
description:
|
||
"List tables and columns in the per-mesh shared database.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Stream tools ---
|
||
{
|
||
name: "create_stream",
|
||
description:
|
||
"Create a real-time data stream in the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Stream name" },
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
{
|
||
name: "publish",
|
||
description:
|
||
"Push data to a stream. Subscribers receive it in real-time.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
stream: { type: "string", description: "Stream name" },
|
||
data: { description: "Any JSON data to publish" },
|
||
},
|
||
required: ["stream", "data"],
|
||
},
|
||
},
|
||
{
|
||
name: "subscribe",
|
||
description:
|
||
"Subscribe to a stream. Data pushes arrive as channel notifications.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
stream: { type: "string", description: "Stream name" },
|
||
},
|
||
required: ["stream"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_streams",
|
||
description:
|
||
"List active streams in the mesh.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Context tools ---
|
||
{
|
||
name: "share_context",
|
||
description:
|
||
"Share your session understanding with the mesh. Call after exploring a codebase area.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
summary: {
|
||
type: "string",
|
||
description: "Summary of what you explored/learned",
|
||
},
|
||
files_read: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "File paths you read",
|
||
},
|
||
key_findings: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Key findings or insights",
|
||
},
|
||
tags: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Tags for categorization",
|
||
},
|
||
},
|
||
required: ["summary"],
|
||
},
|
||
},
|
||
{
|
||
name: "get_context",
|
||
description:
|
||
"Find context from peers who explored an area. Check before re-reading files another peer already analyzed.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
query: {
|
||
type: "string",
|
||
description: "Search query (file path, topic, etc.)",
|
||
},
|
||
},
|
||
required: ["query"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_contexts",
|
||
description: "See what all peers currently know about the codebase.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Task tools ---
|
||
{
|
||
name: "create_task",
|
||
description: "Create a work item for the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
title: { type: "string", description: "Task title" },
|
||
assignee: {
|
||
type: "string",
|
||
description: "Peer name to assign (optional)",
|
||
},
|
||
priority: {
|
||
type: "string",
|
||
enum: ["low", "normal", "high", "urgent"],
|
||
description: "Priority level (default: normal)",
|
||
},
|
||
tags: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Tags for categorization",
|
||
},
|
||
},
|
||
required: ["title"],
|
||
},
|
||
},
|
||
{
|
||
name: "claim_task",
|
||
description: "Claim an unclaimed task to take ownership.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "Task ID" },
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
{
|
||
name: "complete_task",
|
||
description: "Mark a task as done with an optional result summary.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "Task ID" },
|
||
result: {
|
||
type: "string",
|
||
description: "Summary of what was done",
|
||
},
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_tasks",
|
||
description: "List tasks filtered by status and/or assignee.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
status: {
|
||
type: "string",
|
||
enum: ["open", "claimed", "completed"],
|
||
description: "Filter by status",
|
||
},
|
||
assignee: {
|
||
type: "string",
|
||
description: "Filter by assignee name",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
|
||
// --- Scheduled messages ---
|
||
{
|
||
name: "schedule_reminder",
|
||
description:
|
||
"Schedule a one-shot or recurring message. Without `to`, it fires back to yourself (a self-reminder). With `to`, it delivers to a peer, @group, or * broadcast. For one-shot, provide `deliver_at` or `in_seconds`. For recurring, provide `cron` (standard 5-field expression). The broker persists schedules to the database — they survive restarts. Receivers see `subtype: reminder` in the push envelope.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
message: { type: "string", description: "Message or reminder text" },
|
||
deliver_at: { type: "number", description: "Unix timestamp (ms) when to deliver (one-shot)" },
|
||
in_seconds: { type: "number", description: "Alternative to deliver_at: fire after N seconds (one-shot)" },
|
||
cron: { type: "string", description: "Cron expression for recurring reminders (e.g. '0 */2 * * *' for every 2 hours, '30 9 * * 1-5' for 9:30 weekdays)" },
|
||
to: {
|
||
type: "string",
|
||
description: "Recipient: display name, pubkey hex, @group, or * (omit for self-reminder)",
|
||
},
|
||
},
|
||
required: ["message"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_scheduled",
|
||
description: "List all your pending scheduled messages: id, recipient, preview, and delivery time.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "cancel_scheduled",
|
||
description: "Cancel a pending scheduled message before it fires.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
id: { type: "string", description: "Scheduled message ID" },
|
||
},
|
||
required: ["id"],
|
||
},
|
||
},
|
||
|
||
// --- Mesh info ---
|
||
{
|
||
name: "mesh_info",
|
||
description:
|
||
"Get a complete overview of the mesh: peers, groups, state, memory, files, tasks, streams, tables. Call on session start for full situational awareness.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Stats ---
|
||
{
|
||
name: "mesh_stats",
|
||
description:
|
||
"View resource usage stats for all peers: messages sent/received, tool calls, uptime, errors.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- MCP Proxy ---
|
||
{
|
||
name: "mesh_mcp_register",
|
||
description:
|
||
"Register an MCP server with the mesh. Other peers can invoke its tools through the mesh without restarting their sessions. Provide the server name, description, and full tool definitions.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
server_name: { type: "string", description: "Unique name for the MCP server (e.g. 'github', 'jira')" },
|
||
description: { type: "string", description: "What this MCP server does" },
|
||
tools: {
|
||
type: "array",
|
||
items: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string" },
|
||
description: { type: "string" },
|
||
inputSchema: { type: "object", description: "JSON Schema for tool arguments" },
|
||
},
|
||
required: ["name", "description", "inputSchema"],
|
||
},
|
||
description: "Tool definitions to expose",
|
||
},
|
||
persistent: {
|
||
type: "boolean",
|
||
description: "If true, registration survives peer disconnect. Other peers see it as 'offline' until you reconnect. Default: false",
|
||
},
|
||
},
|
||
required: ["server_name", "description", "tools"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_mcp_list",
|
||
description:
|
||
"List MCP servers available in the mesh with their tools. Shows which peer hosts each server.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "mesh_tool_call",
|
||
description:
|
||
"Call a tool on a mesh-registered MCP server. Route: you -> broker -> hosting peer -> execute -> result back. Timeout: 30s.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
server_name: { type: "string", description: "Name of the MCP server" },
|
||
tool_name: { type: "string", description: "Name of the tool to call" },
|
||
args: { type: "object", description: "Tool arguments (JSON object)" },
|
||
},
|
||
required: ["server_name", "tool_name"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_mcp_remove",
|
||
description:
|
||
"Unregister an MCP server you previously registered with the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
server_name: { type: "string", description: "Name of the MCP server to remove" },
|
||
},
|
||
required: ["server_name"],
|
||
},
|
||
},
|
||
|
||
|
||
// --- Simulation clock tools ---
|
||
{
|
||
name: "mesh_set_clock",
|
||
description:
|
||
"Set the simulation clock speed. x1 = real-time, x10 = 10x faster, x100 = 100x. Peers receive heartbeat ticks at the simulated rate.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
speed: {
|
||
type: "number",
|
||
description: "Speed multiplier (1-100). x1 = tick every 60s, x10 = tick every 6s, x100 = tick every 600ms.",
|
||
},
|
||
},
|
||
required: ["speed"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_pause_clock",
|
||
description:
|
||
"Pause the simulation clock. Ticks stop until resumed.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "mesh_resume_clock",
|
||
description:
|
||
"Resume a paused simulation clock.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "mesh_clock",
|
||
description:
|
||
"Get current simulation clock status: speed, tick count, simulated time.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Skills ---
|
||
{
|
||
name: "share_skill",
|
||
description:
|
||
"Publish a reusable skill to the mesh. Other peers can discover and load it. If a skill with the same name exists, it is updated.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Unique skill name (e.g. 'code-review', 'deploy-checklist')" },
|
||
description: { type: "string", description: "Short description of what the skill does" },
|
||
instructions: { type: "string", description: "Full instructions/prompt that a peer loads to acquire this capability" },
|
||
tags: {
|
||
type: "array",
|
||
items: { type: "string" },
|
||
description: "Tags for discoverability",
|
||
},
|
||
},
|
||
required: ["name", "description", "instructions"],
|
||
},
|
||
},
|
||
{
|
||
name: "get_skill",
|
||
description:
|
||
"Load a skill's full instructions by name. Use to acquire capabilities shared by other peers.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Skill name to load" },
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_skills",
|
||
description:
|
||
"Browse available skills in the mesh. Optionally filter by keyword across name, description, and tags.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
query: { type: "string", description: "Search keyword (optional)" },
|
||
},
|
||
},
|
||
},
|
||
{
|
||
name: "remove_skill",
|
||
description:
|
||
"Remove a skill you published from the mesh.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Skill name to remove" },
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
|
||
// --- Diagnostics ---
|
||
{
|
||
name: "ping_mesh",
|
||
description:
|
||
"Send test messages through the full pipeline and measure round-trip timing per priority. Diagnoses push delivery issues.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
priorities: {
|
||
type: "array",
|
||
items: { type: "string", enum: ["now", "next", "low"] },
|
||
description: "Priorities to test (default: [\"now\", \"next\"])",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
|
||
// --- Peer file sharing ---
|
||
{
|
||
name: "read_peer_file",
|
||
description:
|
||
"Read a file from another peer's project. Specify the peer (by name) and the file path relative to their working directory. The peer must be online and sharing files. Max file size: 1MB.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
peer: { type: "string", description: "Peer display name or pubkey" },
|
||
path: { type: "string", description: "File path relative to peer's working directory" },
|
||
},
|
||
required: ["peer", "path"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_peer_files",
|
||
description:
|
||
"List files in a peer's shared directory. Returns a tree of file names (not contents). The peer must be online and sharing files.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
peer: { type: "string", description: "Peer display name or pubkey" },
|
||
path: { type: "string", description: "Directory path relative to peer's cwd (default: root)" },
|
||
pattern: { type: "string", description: "Glob-like filter pattern (e.g. '*.ts', 'src/*')" },
|
||
},
|
||
required: ["peer"],
|
||
},
|
||
},
|
||
|
||
// --- Webhooks ---
|
||
{
|
||
name: "create_webhook",
|
||
description:
|
||
"Create an inbound webhook. Returns a URL that external services (GitHub, CI/CD, monitoring) can POST to — the payload becomes a mesh message to all peers.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: {
|
||
type: "string",
|
||
description: "Webhook name (e.g. 'github-ci', 'datadog-alerts')",
|
||
},
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
{
|
||
name: "list_webhooks",
|
||
description: "List active webhooks for this mesh.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "delete_webhook",
|
||
description: "Deactivate a webhook.",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
name: { type: "string", description: "Webhook name to deactivate" },
|
||
},
|
||
required: ["name"],
|
||
},
|
||
},
|
||
|
||
// --- Service deployment tools ---
|
||
|
||
{
|
||
name: "mesh_mcp_deploy",
|
||
description: "Deploy an MCP server to the mesh from a zip file or git repo. Runs on the broker VPS, persists across peer sessions. Default scope: private (only you).",
|
||
inputSchema: {
|
||
type: "object",
|
||
properties: {
|
||
server_name: { type: "string", description: "Unique name for the server in this mesh" },
|
||
file_id: { type: "string", description: "File ID of uploaded zip (from share_file)" },
|
||
git_url: { type: "string", description: "Git repo URL" },
|
||
git_branch: { type: "string", description: "Branch to clone (default: main)" },
|
||
npx_package: { type: "string", description: "npm package name to run via npx (e.g. @upstash/context7-mcp)" },
|
||
env: { type: "object", description: "Environment variables. Use $vault:<key> for vault secrets." },
|
||
runtime: { type: "string", enum: ["node", "python", "bun"], description: "Runtime (auto-detected if omitted)" },
|
||
memory_mb: { type: "number", description: "Memory limit in MB (default: 256)" },
|
||
network_allow: { type: "array", items: { type: "string" }, description: "Allowed outbound hosts (default: none)" },
|
||
scope: { description: "Visibility: 'peer' (default), 'mesh', or {group/groups/role/peers}" },
|
||
},
|
||
required: ["server_name"],
|
||
},
|
||
},
|
||
{
|
||
name: "mesh_mcp_undeploy",
|
||
description: "Stop and remove a managed MCP server from the mesh.",
|
||
inputSchema: { type: "object", properties: { server_name: { type: "string" } }, required: ["server_name"] },
|
||
},
|
||
{
|
||
name: "mesh_mcp_update",
|
||
description: "Pull latest code and restart a git-sourced MCP server.",
|
||
inputSchema: { type: "object", properties: { server_name: { type: "string" } }, required: ["server_name"] },
|
||
},
|
||
{
|
||
name: "mesh_mcp_logs",
|
||
description: "View recent logs from a managed MCP server.",
|
||
inputSchema: { type: "object", properties: { server_name: { type: "string" }, lines: { type: "number", description: "Lines (default: 50, max: 1000)" } }, required: ["server_name"] },
|
||
},
|
||
{
|
||
name: "mesh_mcp_scope",
|
||
description: "Get or set the visibility scope of a deployed MCP server.",
|
||
inputSchema: { type: "object", properties: { server_name: { type: "string" }, scope: { description: "New scope to set. Omit to read current." } }, required: ["server_name"] },
|
||
},
|
||
{
|
||
name: "mesh_mcp_schema",
|
||
description: "Inspect tool schemas for a deployed MCP server.",
|
||
inputSchema: { type: "object", properties: { server_name: { type: "string" }, tool_name: { type: "string", description: "Specific tool (omit for all)" } }, required: ["server_name"] },
|
||
},
|
||
{
|
||
name: "mesh_mcp_catalog",
|
||
description: "List all deployed services in the mesh with status, scope, and tool count.",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
|
||
// --- Skill deployment tools ---
|
||
|
||
{
|
||
name: "mesh_skill_deploy",
|
||
description: "Deploy a multi-file skill bundle from a zip or git repo.",
|
||
inputSchema: { type: "object", properties: { file_id: { type: "string" }, git_url: { type: "string" }, git_branch: { type: "string" } } },
|
||
},
|
||
|
||
// --- Vault tools ---
|
||
|
||
{
|
||
name: "vault_set",
|
||
description: "Store an encrypted credential in your vault. Reference in mesh_mcp_deploy with $vault:<key>.",
|
||
inputSchema: { type: "object", properties: { key: { type: "string" }, value: { type: "string", description: "Secret value or local file path (for type=file)" }, type: { type: "string", enum: ["env", "file"] }, mount_path: { type: "string" }, description: { type: "string" } }, required: ["key", "value"] },
|
||
},
|
||
{
|
||
name: "vault_list",
|
||
description: "List your vault entries (keys and metadata only, no secret values).",
|
||
inputSchema: { type: "object", properties: {} },
|
||
},
|
||
{
|
||
name: "vault_delete",
|
||
description: "Remove a credential from your vault.",
|
||
inputSchema: { type: "object", properties: { key: { type: "string" } }, required: ["key"] },
|
||
},
|
||
];
|