Skip to main content

Turn harness internal tools into a standard MCP server — compatible with Claude Code, Codex, OpenCode, and more.

Project description

harness_to_mcp: exposes harness internal tools as an MCP server by hijacking LLM API.

What it does

  • starts one MCP HTTP server and one hijack LLM API server on the same port
  • starts one harness process per MCP session
  • extracts the harness tool list from intercepted LLM requests
  • forwards MCP tools/call into the harness tool loop and maps the tool result back to MCP
  • stops the harness process when the MCP session is closed

Supported harnesses

  • harness_to_mcp openclaw/opencode via OpenAI chat completions
  • harness_to_mcp codex via OpenAI responses API
  • harness_to_mcp claude via Anthropic messages API

Exposed endpoints

  • MCP: POST /mcp, POST /harness_to_mcp/mcp (The two MCP paths are equivalent)
  • OpenAI Chat Completions: POST /harness_to_mcp/v1/chat/completions
  • OpenAI Responses: POST /harness_to_mcp/v1/responses
  • Anthropic Messages: POST /harness_to_mcp/v1/messages

Sequence

sequenceDiagram
    participant C as MCP Client
    participant M as harness_to_mcp<br/>MCP Server
    participant H as harness_to_mcp<br/>Hijack API Server
    participant R as Harness

    C->>M: initialize
    M->>R: launch harness session
    R->>H: send hijacked LLM API request
    H-->>M: extract tool list from request
    M-->>C: tools/list

    C->>M: tools/call
    M-->>H: resolve waiting request as tool call
    H-->>R: return tool call payload
    R->>R: execute internal tool
    R->>H: send next request with tool result
    H-->>M: match tool_call_id and deliver tool result
    M-->>C: MCP tool response

Install

pip install harness_to_mcp

Launch a harness directly

harness_to_mcp claude/codex/opencode/openclaw

Each helper command starts its own colocated server and one harness instance together. The harness will be started using an isolated config and will not pollute the user's own config and logs.

Only run the server

harness_to_mcp

This mode starts only the server. It listens on MCP plus all hijack API routes, but does not launch any harness by itself. Users need to configure the hijack API for the harness and start a request to expose its internal tools.

Python API

from harness_to_mcp import HarnessToMcp

with HarnessToMcp(port=9330) as server:
    print(server.mcp_url)
    print(server.hijack_base_url)

Notes

  • the LLM API layer is split into reusable adapters for chat completions, responses, and messages
  • the harness layer is split into reusable launchers for opencode, openclaw, codex, and claude
  • plain server mode never auto-launches a harness
  • intercepted waiting requests stay alive with periodic heartbeat bytes while MCP is deciding the next tool call
  • if the harness does not reconnect to the hijack API within 30 seconds, MCP requests fail with a hijack-not-connected error

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

harness_to_mcp-0.1.1.tar.gz (24.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

harness_to_mcp-0.1.1-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file harness_to_mcp-0.1.1.tar.gz.

File metadata

  • Download URL: harness_to_mcp-0.1.1.tar.gz
  • Upload date:
  • Size: 24.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.7

File hashes

Hashes for harness_to_mcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 f25a8e84665331bbba36685f846e42bd55dc2699184ead787f314270e9b2f134
MD5 3b80a2a520cd3d7f38d339ceab6a062a
BLAKE2b-256 7653e404c2209139bdc5e878e2d00335bd1e15e5af91813b1255d53572daa5e7

See more details on using hashes here.

File details

Details for the file harness_to_mcp-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: harness_to_mcp-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.7

File hashes

Hashes for harness_to_mcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0bda3b0ebc3c27e9eca44902559fe6f9aad21444cdab70a9be4fa4614c33b2b7
MD5 864c364aa5466f55a7787eefbfdd130a
BLAKE2b-256 314898be7fced7cd2210220f449fd56ffeb1783b816064f0ed7c35b35cf58b3a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page