ico-mcp
Opens pull requests on a GitHub repository to crystallize draft operators into stable operators, including operator cards, gate reports, and run statistics for human review and merge.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ico-mcpfind operators to read a CSV and output a typed table, then validate and run the pipeline"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ico-mcp
A universal MCP server on top of ICO, a framework for typed, composable pipelines. An agent builds pipelines from a registry of typed operators, runs them, writes the operators that are missing, and crystallizes the ones that proved useful into stable operators through a GitHub pull request that a human reviews.
search_operators → validate → run ─┬─ works ─→ save_pipeline → crystallize → PR → merge → reload
└─ step missing → propose_operator / propose_typesOperators are not MCP tools: the tool set is fixed, and the agent sees operators as compact cards found by type. Data crosses the JSON boundary by reference (paths), and every run has a process of its own. The decisions are in docs/design/ico-mcp.md; the reference for agents is docs/agent-guide.md.
This repository is a template. A domain server is a clone of it: its operators, types, pipelines and dependencies live in the clone, and its crystallization pull requests go to the clone's repository.
Setup
Requirements:
Python 3.11 or 3.12 and uv;
a checkout of ICO next to this repository (
../ico): during development ICO is an editable path dependency ([tool.uv.sources]inpyproject.toml);gh, authenticated (
gh auth login), only forcrystallize.
uv syncmake cimake ci runs ruff, pyright (strict) and the tests; the tests never touch
the network.
Related MCP server: agent-tasks
Connect a client
The server speaks MCP over stdio. Use absolute paths: clients start it from their own working directory.
Claude Code, from any directory:
claude mcp add ico -- uv run --directory /abs/path/to/ico-mcp ico-mcpor a project-scoped .mcp.json in the root of the project you work in
(it is machine-specific, so this repository ignores its own):
{
"mcpServers": {
"ico": {
"command": "uv",
"args": ["run", "--directory", "/abs/path/to/ico-mcp", "ico-mcp"]
}
}
}Claude desktop app: add the same mcpServers block to
claude_desktop_config.json (macOS:
~/Library/Application Support/Claude/claude_desktop_config.json, Windows:
%APPDATA%\Claude\claude_desktop_config.json) and restart the app. The
app does not inherit your shell's PATH, so set "command" to the
absolute path of uv (which uv). The Code tab also reads the project's
.mcp.json.
ico-mcp --root <dir> serves another repository than the one the package
was installed from.
Workflow
Reuse.
list_pipelines/get_pipeline, else compose from operators:search_operatorsby input and output type,validate,run.Extend. When a step is missing, the agent writes a draft:
propose_operator(stages write → typecheck → load → register → examples) andpropose_typesfor shared types. Drafts live indomain_draft/(ignored by git) and load asdraft.Run and watch.
runreturns outputs and the URL of the dashboard (the ICO Live Board: progress of every node and the pipeline plan). Long runs start withrun(wait=false)and are followed withrun_statusor stopped withcancel_run.Keep.
save_pipelinestores a validated spec inpipelines/.Crystallize. With the human's consent,
crystallizecopies the drafts into the stable package in a branch of its own (the working tree is not touched), runs a gate (load, pyright strict, no draft imports, the examples, every saved pipeline validates), pushes and opens a pull request with the operator cards, the gate report and run statistics.Merge. The human reviews the abstraction and merges, pulls, and the agent calls
reload: drafts that are now stable are retired.
Tool | Does |
| find operators by input / output type, text, tags; compact cards |
| a card with the operator's source |
| domain types with fields and docstrings |
| type-check a spec; issues carry their location in the spec |
| run a spec on a JSON input; |
| follow or stop a run |
| the URL of the dashboard |
| the reference for agents ( |
| add or replace a draft module, in checked stages |
| saved, validated specs |
| a pull request that makes drafts stable |
| restart the kernel after a merge or manual edits |
Specialize a clone
Clone this repository (or use it as a GitHub template) under the domain's name.
Rename the packages:
domain/→<pkg>/anddomain_draft/→<pkg>_draft/(the draft package is always the stable one plus_draft). Update the drafts lines in.gitignoreto the new name.Edit
ico.toml:name,package = "<pkg>", andgithub = { repo = "owner/<pkg>-mcp", base = "main" }for crystallization.envlists the variables the operators may read (e.g.HF_HOME); others never reach them.Edit
pyproject.toml: the projectname, and add the domain's dependencies (e.g. torch); operators run with the same environment.Delete the demo draft
domain_draft/demo.pyand its example.Write the domain's notes into section 8 of
docs/agent-guide.md: data locations, formats, conventions, typical pipelines. Agents read it with theguidetool.Keep
tests/test_domain_examples.py: it runs the examples of every stable operator and is part of the crystallization gate.
Server fixes reach a clone through git:
git remote add template https://github.com/apriori3d/ico-mcp.gitgit pull template mainDevelopment
src/ico_mcp/
server.py MCP tools and instructions; hosts the dashboard
kernel.py child process: imports operators, search, validate, run
kernel_client.py starts, times out and restarts kernels
jobs.py runs, each in a kernel of its own
proposals.py propose_operator / propose_types stages
drafts.py relative imports, closure, retiring crystallized drafts
crystallize.py worktree, gate, pull request
domain_types.py, type_names.py, pipelines.py, traces.py, progress.py
domain/ domain_draft/ pipelines/ examples/ runs/ the domain (runs/ is ignored)The server process never imports operator code; only kernels do. Tests use
local bare git repositories as remotes and a fake gh executable.
This server cannot be deployed
Maintenance
Related MCP Connectors
- AxiomOAuthcom.axiomide
The marketplace where agents don't just use tools — they build, publish, and compose new ones.
Git-backed platform for skills, tools, and context for AI agents
Discover, run, inspect, build, test, and privately reuse AI workflows.
- SkilderOAuthai.skilder
One place to build, share, and govern the skills and tools your AI agents use at work.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create, share, discover, and execute reusable multi-step workflow templates.MIT
- AlicenseNot gradedqualityCmaintenanceEnables pipeline-driven task management for AI coding agents, with stage-gated workflows, dependency tracking, artifact versioning, and multi-agent collaboration.94 npm22MIT
- FlicenseCqualityFmaintenanceEnables reasoning agents to turn PRDs into production-ready applications by discovering and reusing existing features, UI components, database models, and templates, then planning, scaffolding, validating, and preparing Git changes for review.29-
- AlicenseNot gradedqualityCmaintenanceExposes a synthetic issue tracker and pipeline warehouse as callable tools so an agent can answer operational questions about tickets, pipeline health, runs, incidents, and governed metrics with every claim cited to the exact tool call it came from. All writes are proposal-only, requiring human approval through a gated apply path that logs each step for audit.MIT