Spawn MCP servers from declarative YAML configuration
Project description
Teukhos
You describe the tool. Teukhos forges it as MCP.
Spawn production-ready MCP servers from a single YAML file. No Python required.
pip install teukhos
teukhos serve git-tools.yaml
That's it. Your CLI tools are now callable by any AI agent.
The Problem
The MCP ecosystem has a critical gap:
| What exists | What's missing |
|---|---|
| Raw FastMCP — write Python | Config-as-code → running MCP server |
any-cli-mcp-server — scrapes --help |
Structured, typed CLI → tool mapping |
| Enterprise gateways (Bifrost, MCPX) | Lightweight, developer-owned, open-source |
| Visual builders (Langflow, n8n) | CI/CD-native, GitOps-friendly runtime |
Teukhos fills this gap. Define your tools in YAML. Run one command. Done.
30-Second Quickstart
Install:
pip install teukhos
# or: uvx teukhos
Create teukhos.yaml:
forge:
name: "my-tools"
tools:
- name: git_log
description: "Show recent git commits"
adapter: cli
cli:
command: git
subcommand: [log, --oneline]
args:
- name: count
type: integer
flag: "-n"
default: 10
output:
type: stdout
Serve:
teukhos serve teukhos.yaml
Add to Claude Desktop:
teukhos install teukhos.yaml --client claude-desktop
Ask Claude: "Show me the last 5 commits" — it uses the tool.
How It Works
teukhos.yaml
│
▼
┌─────────────┐
│ Parser │ Pydantic validation, type checking, early error detection
└──────┬──────┘
│
▼
┌─────────────┐
│ Adapter │ Builds async handler functions per tool
│ Factory │
└──────┬──────┘
│
▼
┌─────────────┐
│ FastMCP │ Registers tools with correct JSON Schema
│ Builder │ (inferred from your arg definitions)
└──────┬──────┘
│
▼
┌─────────────┐
│ MCP Server │ stdio or HTTP — ready for Claude, Cursor, any MCP client
└─────────────┘
CLI Reference
teukhos serve [config] Start the MCP server
teukhos validate [config] Validate config, exit 0/1 — use in CI
teukhos install [config] Register with Claude Desktop
teukhos wait-ready Poll /health until ready — use in CI pipelines
teukhos version Print version
teukhos discover <binary> (Coming v0.3) Auto-generate config from --help
Options for serve:
--transport -t Override transport: stdio | http (default: from config)
--port -p Override HTTP port (default: 8765)
Config file names: Teukhos looks for teukhos.yaml by default. Legacy mcp-forge.yaml is accepted automatically with a deprecation note.
Full Config Reference
forge:
name: "my-toolset" # MCP server identity
version: "1.0.0"
description: "What this server does"
server:
transport: stdio # stdio | http
host: "127.0.0.1" # use 0.0.0.0 for remote (add auth!)
port: 8765
auth:
mode: none # none | api_key
api_keys:
- "${MY_API_KEY}"
tools:
- name: tool_name # snake_case — used as MCP tool ID
description: "What the LLM reads to decide when to call this tool"
adapter: cli # cli is the only adapter in v0.2
cli:
command: "mybinary" # must be on PATH or absolute path
subcommand: [] # e.g. ["log", "--oneline"] for git
timeout_seconds: 30
working_dir: null # defaults to cwd
env: {} # extra env vars for this tool
args:
- name: arg_name
type: string # string | integer | number | boolean
description: "Shown to the LLM"
required: false
flag: "--flag" # CLI flag: -f or --flag
positional: false # true = append at end of command
default: null
enum: [] # restrict to allowed values
secret: false # redact from logs
output:
type: stdout # stdout | stderr | json_field | exit_code
field: null # for json_field: dot-notation path e.g. "data.items"
exit_codes: # for exit_code type: map codes to messages
0: "Success"
1: "Not found"
Example Configs
Git Tools
forge:
name: "git-tools"
tools:
- name: git_log
description: "Show recent git commits"
adapter: cli
cli:
command: git
subcommand: [log, --oneline]
args:
- name: count
type: integer
flag: "-n"
default: 10
output:
type: stdout
- name: git_status
description: "Show working tree status"
adapter: cli
cli:
command: git
subcommand: [status, --short]
output:
type: stdout
- name: git_diff
description: "Show diff of current changes"
adapter: cli
cli:
command: git
subcommand: [diff]
args:
- name: staged
type: boolean
description: "Show staged changes only"
flag: "--staged"
output:
type: stdout
System Tools
forge:
name: "sysops"
tools:
- name: disk_usage
description: "Show disk usage for a path"
adapter: cli
cli:
command: du
subcommand: ["-sh"]
args:
- name: path
type: string
positional: true
default: "."
output:
type: stdout
- name: ping_host
description: "Check if a host is reachable"
adapter: cli
cli:
command: ping
subcommand: ["-c", "3"]
timeout_seconds: 15
args:
- name: host
type: string
required: true
positional: true
output:
type: exit_code
exit_codes:
0: "Host is reachable"
1: "Host is unreachable"
JSON Output
- name: get_video_info
description: "Get video metadata as JSON"
adapter: cli
cli:
command: ffprobe
subcommand: ["-v", "quiet", "-print_format", "json", "-show_format"]
args:
- name: input_file
type: string
required: true
positional: true
output:
type: json_field
field: "format.duration" # extract a specific field
CI/CD Integration
GitHub Actions
- name: Install Teukhos
run: pip install teukhos
- name: Validate config
run: teukhos validate teukhos.yaml
- name: Start MCP server
run: |
teukhos serve teukhos.yaml --transport http --port 8765 &
teukhos wait-ready --timeout 30
- name: Run agent tasks
run: |
claude --mcp http://localhost:8765/mcp \
"Analyse the git log and summarise what changed this week"
- name: Teardown
if: always()
run: pkill -f "teukhos serve" || true
Docker
FROM python:3.12-slim
RUN pip install teukhos
COPY teukhos.yaml .
EXPOSE 8765
HEALTHCHECK CMD teukhos wait-ready --timeout 5
CMD ["teukhos", "serve", "--transport", "http"]
Claude Desktop (manual)
{
"mcpServers": {
"teukhos-git": {
"command": "teukhos",
"args": ["serve", "/path/to/git-tools.yaml"]
}
}
}
Or use the install command: teukhos install git-tools.yaml --client claude-desktop
Roadmap
v0.2 — Current
- YAML parser + Pydantic schema validation
cliadapter with typed arg mapping- Output mapping:
stdout,stderr,json_field,exit_code - FastMCP server generation at runtime
stdioandhttptransportsapi_keyauthteukhos validatefor CI lintingteukhos wait-readyfor CI health checksteukhos installfor Claude Desktop registration- Health endpoint
/health
v0.3 — Production Ready
restadapter (wrap any HTTP endpoint)shelladapter (inline bash/pwsh scripts)- Hot reload — save YAML, tools update without restart
teukhos discover <binary>— AI-powered config generation from--help- OAuth 2.1 + JWT auth
- Tool-level RBAC
- Append-only audit log
- Streaming output support
- Lock file (
teukhos.lock) for reproducible deployments
v0.4 — The Platform
- Embedded web UI — dark glass, real-time tool call visualization
- Bidirectional YAML ↔ visual editor sync
- OpenAPI auto-import adapter
- Tool composition / mini pipelines
- Prometheus metrics at
/metrics - Public registry:
teukhos install registry://community/git-tools
Why Teukhos?
You provide the MCP specification. Teukhos does the forging.
Contributing
git clone https://github.com/MihaiCiprianChezan/teukhos
cd teukhos
pip install -e ".[dev]"
pytest
Pull requests welcome.
License
MIT — see LICENSE.
Built by Mihai Ciprian Chezan
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file teukhos-0.2.0.tar.gz.
File metadata
- Download URL: teukhos-0.2.0.tar.gz
- Upload date:
- Size: 17.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76f992315de36a3df3bd2b10e0650680b0dd6ed8b8cb88374f8f09dad7094475
|
|
| MD5 |
380cb59438469584c04d1ab2b014bf9d
|
|
| BLAKE2b-256 |
56e17df9ede5df9bbe612be502870da69d76dbd3d2a7c69056aa9792c53ded42
|
File details
Details for the file teukhos-0.2.0-py3-none-any.whl.
File metadata
- Download URL: teukhos-0.2.0-py3-none-any.whl
- Upload date:
- Size: 14.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3c60d750a60e5b354eab45a7919dfc3e9c5bf2aa22e5e27c19a42350bff92fb
|
|
| MD5 |
e0195ed9383d4ffc75ca03c82d17cffd
|
|
| BLAKE2b-256 |
38eff6de335f839f3d2c83ade58d8c1d156aa59442084959164e13b0bddcf702
|