subs MCP server
2026년 11월 6일 커밋MCP server를 도구 실행에 사용하여 권한이 제한된 에이전트 루프를 실행하며, 로컬, 원격 및 팀 배포를 지원하는 에이전트 하네스입니다.
다른 이름 substructureai/subs
- 스타
- 13
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 6일
- 라이선스
- MIT
subs MCP란?
subs은(는) MCP server입니다. MCP server를 도구 실행에 사용하여 권한이 제한된 에이전트 루프를 실행하며, 로컬, 원격 및 팀 배포를 지원하는 에이전트 하네스입니다.
프로젝트 README에서 생성된 요약
subs MCP server 정보
subs는 클라우드 기반 AI 에이전트를 구축하는 개발자가 도구 실행 기능이 포함된 권한 제한 에이전트 루프를 실행할 수 있도록 지원합니다. 이 하네스는 내구성, 재시도, 타임아웃 및 세션 상태를 포함하여 에이전트의 전체 라이프사이클을 관리합니다. CLI를 통해 로컬에 배포하거나, 셀프 호스팅 서버로 실행하거나, 호스팅된 엔진을 통해 사용할 수 있습니다. 사용자는 toml 파일을 사용하여 에이전트를 구성하며, OpenRouter, Anthropic 또는 OpenAI와 같은 LLM 제공업체를 정의합니다.
개발자는 Sentry 또는 Linear와 같은 특화된 도구를 위해 에이전트를 MCP server에 연결할 수 있습니다. 이 시스템은 DM 또는 멘션을 통해 에이전트를 Slack에 직접 통합하는 것을 포함하여 다양한 배포 모드를 지원합니다. 세밀한 제어가 필요한 경우, 하네스를 통해 에이전트가 HTTP 엔드포인트를 가리키도록 설정하여 웹훅을 통해 의사결정을 처리할 수 있습니다. 엔진이 표준 웹훅과 JSON 스키마를 통해 통신하므로, 특정 SDK 없이도 모든 언어에서 커스텀 로직을 구현할 수 있습니다.
활용 사례
- 1Slack에 에이전트 배포에이전트를 Slack 워크스페이스에 연결하여 직접 메시지나 채널 멘션에 응답할 수 있도록 합니다.
- 2웹훅으로 에이전트 로직 제어에이전트가 커스텀 URL을 가리키도록 설정하여 엔진이 제안하는 모든 의사결정을 가로채고 수정합니다.
- 3사용자별 도구 자격 증명 관리에이전트가 사용자 범위의 연결을 사용하도록 구성하여 각 사용자가 자신의 계정으로 상호작용할 수 있게 합니다.
- 4장시간 실행되는 백그라운드 작업 실행즉각적인 응답 대신 호출을 수락하고 나중에 결과를 보고하는 비동기 도구를 사용합니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
구성
OPENROUTER_API_KEY
| 이름 | 설명 | 유형 |
|---|---|---|
| OPENROUTER_API_KEY | — |
자동 검사
2026년 11월 15일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능substructureai/subs is public and reachablegithub.com/substructureai/subs ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-06github.com/substructureai/subs ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기subs
Pre-1.0: APIs and the wire protocol can change between releases.
subs is an agent harness for the cloud.
It runs an unprivileged agent loop with no system access. It uses MCP servers for tools. It runs locally or as a client and a server.
Declare your agents in a config file. To customize the loop, point an agent at an HTTP endpoint and answer a webhook.
subs handles durability, retries, timeouts, MCP connection management, session state, session branching, AG-UI, Slack connection, LLM calls, subagents, interrupts and more.
To turn a sandbox into an MCP server, see mcpd.
Get started
Install the CLI
curl -fsSL https://subs.dev/cli.sh | bash
The CLI is also the engine.
Run an agent on your machine
Create a subs.toml.
name = "example"
[llm.openrouter]
type = "openrouter"
[agent.teammate]
llm = "openrouter"
model = "deepseek/deepseek-v4-flash-0731"
system = "You are a helpful teammate."
Set your provider key and talk to the agent.
export OPENROUTER_API_KEY=sk-or-...
subs chat teammate -c subs.toml
Run the engine as a server
Add a [serve] section and a [remote] that points at it.
[serve]
port = 9999
auth = false
[remote]
url = "http://localhost:9999"
Start the server.
subs serve -c subs.toml
In another terminal, the same chat command now talks to it.
subs chat teammate -c subs.toml
Run the agent on substructure.ai
Point [remote] at the hosted engine instead of your own.
[remote]
url = "https://api.substructure.ai"
Create the project from the file, then upload your LLM key.
subs apply
subs auth llm.openrouter
The same chat command now runs the turn on the hosted engine.
subs chat teammate -c subs.toml
Put the agent in Slack
Say which agent takes a DM and which one answers a mention.
[slack]
dm = "teammate"
mentions = "teammate"
Apply the file again, then connect your workspace.
subs apply
subs slack connect
Mention the bot in a channel and it answers in the thread.
Connect the agent to an MCP server
Declare the server and give it to an agent. Every user of the agent shares one credential.
[mcp.sentry]
url = "https://mcp.sentry.dev/mcp"
[agent.teammate]
llm = "openrouter"
model = "deepseek/deepseek-v4-flash-0731"
system = "You are a helpful teammate."
mcp = ["mcp.sentry"]
Authorize the connection.
subs auth mcp.sentry
Give each user their own MCP connection
Set credential = "user" and each user connects their own account. A
user-scoped connection works only in a one-on-one chat between the agent and
that user.
[mcp.linear]
url = "https://mcp.linear.app/mcp"
credential = "user"
[agent.personal]
llm = "openrouter"
model = "deepseek/deepseek-v4-flash-0731"
system = "Help me with my Linear issues."
mcp = ["mcp.linear"]
[slack]
dm = "personal"
mentions = "teammate"
Control the agent loop with a webhook
Point an agent at a URL and the engine sends every decision for that agent to your code. This gives you full control of the loop, including how the agent behaves in Slack.
[agent.teammate]
llm = "openrouter"
model = "deepseek/deepseek-v4-flash-0731"
system = "You are a helpful teammate."
mcp = ["mcp.sentry"]
worker = "https://example.com/agent"
Your endpoint reads the engine's proposal and returns it, changing only the steps you care about. There is no SDK to install.
import { serve } from "@hono/node-server";
import { Hono } from "hono";
import type { DecisionRequest, DecisionResponse } from "./protocol.ts";
function decide({ trigger, proposed }: DecisionRequest): DecisionResponse {
if (trigger.type === "session.start") {
return {
agent: {
...proposed.agent,
tools: [{ name: "current_time", description: "Get the current time" }]
}
};
}
// Run our tool when the model calls it.
if (trigger.type === "tool.execute" && trigger.name === "current_time") {
return { actions: [{ type: "tool.result", result: new Date().toISOString() }] };
}
// Accept the engine's proposal for everything else.
return proposed;
}
const app = new Hono();
app.post("/", async (c) => c.json(decide(await c.req.json())));
serve({ fetch: app.fetch, port: 4444 });
Only the agents that name a worker use one. The rest stay with the engine, in the same project and the same file.
Full walkthrough in the quick start. Docs: Workers, Connectors, Slack, Local development
Features
Slack
Mention the bot or DM it. The thread is the session. Route different channels to different agents.
Docs: Slack
Terminal chat
subs chat holds one session open, streams the reply as it is written, and
turns an approval prompt into a picker. The session is the same kind a Slack
thread is.
Docs: Chat
Examples: no-code-chat
Custom decisions
At each step the engine tells your code what it plans to do next. Accept the plan or do something else. A working agent is a few lines.
Docs: How it works
Any language
Your agent is an HTTP endpoint. Generate typed bindings from the published JSON schema.
Docs: Typed bindings
Examples: Go, Python, TypeScript, Elixir
MCP connectors
Declare an MCP server and the engine handles the authorization, reads the tools it offers, and runs every call. Your code never holds a token.
Docs: Connectors
Examples: Node
Plugins
Point an agent at an agent-plugins directory and it gets that plugin's skills and MCP servers.
Docs: Plugins
Any LLM
The engine calls Anthropic, OpenAI, or OpenRouter with your key. Or your worker makes the call and the engine never sees a key.
Docs: LLMs
Examples: Anthropic, OpenAI, OpenRouter
System One models
Your worker asks a fast model typed questions, such as TypeSafe's Jev or Cloudflare's Clef, and gets answers with a confidence. Route, guard, or score in the middle of a turn. The engine holds the key and saves every call.
Docs: System One models
Examples: Node
Crash recovery
Every step is saved before it runs. A run continues from where it stopped. The same message submitted twice runs once.
Docs: Durability
Human approval
An agent can stop and wait for a person to approve, then continue. A waiting agent uses no compute. In Slack this is a button.
Docs: Interrupts
Tools that take hours
A tool does not have to answer immediately. Accept the call, do the work on your own schedule, and report the result later.
Docs: Async tools
Chat history, editing, and branching
History, editing, regeneration, and branching belong to the engine. A user can edit an earlier message and go a new direction. The original branch stays.
Docs: Conversations
Existing chat UIs
The engine streams AG-UI events, so assistant-ui and CopilotKit connect to it directly.
Docs: AG-UI
Examples: assistant-ui, CopilotKit
Tools that run in the browser
A tool can run in the user's browser instead of on your server. The run waits for the browser, then continues.
Docs: Client-side tools
Examples: Node
Agent state without a database
The engine stores your agent's state with the conversation. Your code gets it on every request and writes changes back.
Docs: Agent state
Subagents
An agent can give work to other agents. Each child runs in its own session. The parent's totals include each child's cost and token use.
Docs: Subagents
Validated tool calls
Give a tool an input and output schema. The engine checks every call against it.
Docs: Tool calls
Retries and timeouts
Set a policy on any tool or model call. The engine applies it, and keeps applying it after a restart.
Docs: Retries and timeouts
Self-hosting
Run the engine on your own servers and hold every credential.
Docs: Self-hosting
Parts of the system
- Engine. Runs the agent loop, in Rust. It calls the model, runs tools, saves each step, retries failures, streams events, and supervises subagents. Use the hosted version at app.substructure.ai, run it from the CLI, or embed it in your process.
- Workers. Your agent code. It receives a trigger and returns actions. It runs in your codebase with your dependencies.
- Clients. They send work and stream events back, from your backend or from the browser. Slack and AG-UI are clients.
- CLI. Set up, deploy, watch, and debug from the terminal. It also runs the engine locally.
Install
curl -fsSL https://subs.dev/cli.sh | bash
The script verifies the release checksum and installs to ~/.local/bin. Set
SUBS_INSTALL_DIR to install elsewhere and SUBS_VERSION to pin a release.
Docs
Full documentation in docs/.
License
subs MCP 질문
Slack에서 에이전트를 실행할 수 있나요?
네, 설정 파일에서 DM 및 멘션을 처리할 에이전트를 지정하여 Slack에 에이전트를 배치할 수 있습니다.
subs는 도구 실행을 어떻게 처리하나요?
도구 실행을 위해 MCP server를 사용하며, 권한 부여, 도구 읽기 및 실행을 자동으로 처리할 수 있습니다.
자체 LLM 제공업체를 사용할 수 있나요?
네, 엔진은 제공된 API 키를 사용하여 Anthropic, OpenAI 또는 OpenRouter를 호출할 수 있습니다.