Forkit
Forkit is the only MCP you need for your team of agents.
What it can do
- Execute Code: Execute an async JavaScript function in a real V8 isolate with your workspace API. Returns { result, logs, duration_ms }. TypeScript SDK: ```typescript type TaskStatus = 'pending' | 'in_
- Search Api: Return TypeScript type definitions for the execute_code codemode SDK. Call once per session and cache the result.
- Ready Tasks: Return all pending tasks with no unresolved blockers — the topological ready set. Use as your starting point to find the next task to work on.
What data it sees
Do you need an account
No: the server works without sign-in
Forkit is the only MCP you need for your team of agents. It is a persistent coordination infrastructure for multi-agent AI systems, exposed as a single MCP endpoint.
How to connect
How to connect Forkit to Claude
The server address to paste into Claude settings:
https://forkit--zeintesit.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Forkit to ChatGPT
The server address to paste into ChatGPT settings:
https://forkit--zeintesit.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Forkit to Cursor
The server address to paste into Cursor settings:
https://forkit--zeintesit.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (7)
Raw names from tools/list. Only developers need these.
| execute_code | Execute an async JavaScript function in a real V8 isolate with your workspace API. Returns { result, logs, duration_ms }. TypeScript SDK: ```typescript type TaskStatus = 'pending' | 'in_progress' | 'done' | 'cancelled'; type Priority = 'urgent' | 'high' | 'medium' | 'low'; type DependencyType = 'blocks' | 'parent' | 'related'; type ProjectStatus = 'active' | 'archived'; type SprintStatus = 'planned' | 'active' | 'completed'; interface Task { id: string; workspace_id: string; title: string; description: string | null; status: TaskStatus; claimed_by: string | null; created_at: string; updated_at: string; metadata: Record<string, unknown> | null; project_id: string | null; sprint_id: string | null; priority: Priority; assignee: string | null; estimate: number | null; } interface Project { id: string; workspace_id: string; name: string; description: string | null; status: ProjectStatus; icon: string | null; created_at: string; updated_at: string; } interface Sprint { id: string; workspace_id: string; project_id: string | null; name: string; goal: string | null; start_date: string | null; end_date: string | null; status: SprintStatus; created_at: string; } interface Label { id: string; workspace_id: string; name: string; color: string; created_at: string; } interface Comment { id: string; task_id: string; author: string; author_type: 'agent' | 'human'; body: string; created_at: string; } type SettlementStatus = 'pending' | 'settled' | 'failed' | 'expired'; interface Payment { id: string; workspace_id: string; /** MCP tool that triggered the payment (e.g. 'create_task', 'summarize_session') */ tool: string; /** USDC wei string (6 decimals): '10000' = $0.01, '50000' = $0.05 */ amount: string; tx_hash: string | null; created_at: string; settlement_status: SettlementStatus; on_chain_tx_hash: string | null; settlement_attempts: number; failure_reason: string | null; } declare const codemode: { // Tasks list_tasks(filters?: { status?: TaskStatus; claimed_by?: string; parent_id?: string; overdue?: boolean }): Promise<Task[]>; get_task(task_id: string): Promise<Task | null>; ready_tasks(): Promise<Task[]>; create_task(args: { title: string; description?: string; metadata?: Record<string, unknown>; project_id?: string; sprint_id?: string; priority?: Priority; assignee?: string; estimate?: number; }): Promise<Task>; claim_task(args: { task_id: string; agent_id: string }): Promise<Task | null>; update_task(args: { task_id: string; status?: TaskStatus; description?: string; metadata?: Record<string, unknown>; project_id?: string; sprint_id?: string; priority?: Priority; assignee?: string; estimate?: number; }): Promise<Task | null>; add_dependency(args: { blocker_id: string; blocked_id: string; dependency_type?: DependencyType }): Promise<void>; delete_task(task_id: string): Promise<Task | null>; // Projects create_project(args: { name: string; description?: string; icon?: string }): Promise<Project>; list_projects(filters?: { status?: ProjectStatus }): Promise<Project[]>; get_project(project_id: string): Promise<Project | null>; update_project(args: { project_id: string; name?: string; description?: string; status?: ProjectStatus }): Promise<Project | null>; // Sprints create_sprint(args: { project_id?: string; name: string; goal?: string; start_date?: string; end_date?: string }): Promise<Sprint>; list_sprints(filters?: { project_id?: string; status?: SprintStatus }): Promise<Sprint[]>; get_active_sprint(project_id: string): Promise<Sprint | null>; update_sprint(args: { sprint_id: string; name?: string; goal?: string; status?: SprintStatus; start_date?: string; end_date?: string }): Promise<Sprint | null>; // Comments add_comment(args: { task_id: string; body: string; author?: string; author_type?: 'agent' | 'human' }): Promise<Comment>; list_comments(task_id: string): Promise<Comment[]>; // Labels create_label(args: { name: string; color?: string }): Promise<Label>; list_labels(): Promise<Label[]>; add_label_to_task(args: { task_id: string; label_id: string }): Promise<void>; remove_label_from_task(args: { task_id: string; label_id: string }): Promise<void>; list_labels_for_task(task_id: string): Promise<Label[]>; // Trajectories fork_trajectory(args: { name: string; from_execution_id?: string }): Promise<Trajectory | { error: string }>; switch_trajectory(args: { id: string }): Promise<Trajectory | { error: string }>; list_trajectories(): Promise<Trajectory[]>; get_current_trajectory(): Promise<Trajectory & { recent_executions: Execution[] }>; // Payments /** * Returns payments charged to this workspace, newest first. * @param opts.since Unix-ms cutoff — only payments created after this timestamp * @param opts.limit Max rows to return (default 100, max 500) * amount is a USDC wei string (6 decimals): '10000' = $0.01, '50000' = $0.05 */ list_payments(opts?: { since?: number; limit?: number }): Promise<Payment[]>; }; interface Trajectory { id: string; workspace_id: string; name: string; parent_id: string | null; branched_from_execution_id: string | null; status: 'active' | 'archived'; created_at: string; } interface Execution { id: string; workspace_id: string; trajectory_id: string | null; code: string; result: string | null; error: string | null; logs: string | null; duration_ms: number | null; status: 'success' | 'error' | 'timeout'; created_at: string; } interface AgentSession { id: string; workspace_id: string; task_id: string; agent_id: string; trajectory_id: string | null; status: 'active'|'completed'|'failed'|'paused'; created_at: string; updated_at: string; } type ActivityType = 'thought' | 'action' | 'result' | 'error'; // start_session({ task_id: string, agent_id: string }): Promise<AgentSession> // log_activity({ session_id: string, type: ActivityType, body: string, execution_id?: string }): Promise<void> // complete_session({ session_id: string, status: 'completed'|'failed'|'paused' }): Promise<void> // list_sessions(filter?: { task_id?: string, agent_id?: string, status?: string }): Promise<AgentSession[]> interface Webhook { id: string; workspace_id: string; url: string; events: string[]; enabled: boolean; created_at: string; last_fired_at: string | null; } // register_webhook({ url: string, events: string[], secret: string }): Promise<Webhook> // Registers a new outbound webhook. Events are fired for: task.created, task.updated, // task.claimed, task.deleted, session.started, session.completed, trajectory.forked, trajectory.switched // secret is used for HMAC-SHA256 signature in X-MCP-Signature header. // list_webhooks(): Promise<Webhook[]> -- secret NOT included in response // delete_webhook(id: string): Promise<void> ``` Example: ```javascript async () => { const ready = await codemode.ready_tasks(); const claimed = await codemode.claim_task({ task_id: ready[0].id, agent_id: "claude" }); return { claimed: claimed?.id }; } ``` |
| search_api | Return TypeScript type definitions for the execute_code codemode SDK. Call once per session and cache the result. |
| ready_tasks | Return all pending tasks with no unresolved blockers — the topological ready set. Use as your starting point to find the next task to work on. |
| claim_task | Atomically claim a pending task for an agent. Race-condition-safe — only one agent wins when two claim the same task simultaneously. |
| wait_for_task | Block until a ready task is available for the given assignee. Wakes within ~250ms when a task becomes claimable. Use instead of polling ready_tasks. |
| summarize_session | Generate an AI digest of the current session and persist it to R2 memory as a Markdown file. Call at the end of every work session. |
| list_executions | Return recent execute_code audit records for this workspace. Each record includes status, duration_ms, and any error. |