Junctio MCP server
2026년 11월 13일 커밋proactive OAuth 토큰 갱신 및 관리 웹 UI를 통해 stdio, Docker, 원격 MCP server를 단일 URL로 통합합니다.
다른 이름 k2so-dev/junctio
- 스타
- 5
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 13일
- 라이선스
- MIT
Junctio MCP란?
Junctio은(는) MCP server입니다. proactive OAuth 토큰 갱신 및 관리 웹 UI를 통해 stdio, Docker, 원격 MCP server를 단일 URL로 통합합니다.
프로젝트 README에서 생성된 요약
Junctio MCP server 정보
Junctio는 개인 개발자와 소규모 팀이 단일 진입점을 통해 여러 Model Context Protocol 연결을 관리할 수 있도록 지원합니다. 이 셀프 호스팅 게이트웨이는 stdio, Docker, 원격 MCP server를 하나의 통합 엔드포인트로 집계하여 Claude Code, Codex, Cursor와 같은 도구를 단일 URL에 연결할 수 있게 합니다. 관리 웹 UI를 사용하여 서버를 네임스페이스로 구성하고 서로 다른 클라이언트에 특정 API key를 발급할 수 있습니다.
보안 및 연결성은 선제적인 OAuth 토큰 갱신을 통해 처리되며, 이를 통해 사용 중에 상위 인증이 만료되지 않도록 보장합니다. 시스템은 사용자의 기기에서 텔레메트리나 분석 데이터를 전송하지 않도록 설계되어 프라이버시를 보호합니다. 배포는 Docker Compose를 사용하는 단일 컨테이너를 통해 이루어지며, 저장된 토큰을 암호화하기 위해 JUNCTIO_SECRET이 필요합니다. 또한 관리 MCP server가 포함되어 있어 AI agent가 웹 인터페이스 대신 게이트웨이를 직접 구성할 수 있습니다.
활용 사례
- 1여러 MCP 연결 통합AI 클라이언트를 단일 URL로 지정하여 집계된 서버 모음에 액세스합니다.
- 2인증 실패 방지OAuth 토큰을 정기적으로 갱신하여 상위 연결이 활성 상태를 유지하도록 합니다.
- 3게이트웨이 구성 자동화전용 관리 도구를 통해 AI agent를 사용하여 서버 설정을 관리합니다.
- 4프라이빗 게이트웨이 배포모든 데이터와 텔레메트리를 로컬에 유지하는 셀프 호스팅 환경을 실행합니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
구성
JUNCTIO_SECRET
| 이름 | 설명 | 유형 |
|---|---|---|
| JUNCTIO_SECRET | — |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능k2so-dev/junctio is public and reachablegithub.com/k2so-dev/junctio ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-10-26github.com/k2so-dev/junctio ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기Junctio
Self-hosted MCP gateway for one developer or a small team. One container, one volume, one endpoint per client.
The promise: auth does not go stale. Not between your client and the gateway, and not between the gateway and its upstreams.
- No telemetry. Nothing leaves your machine. There is no phone-home, no analytics, no update ping. The one outbound call the UI ever makes is to the public MCP registry, on the Explore page, and only while you are looking at it. Switch on the security audit and there is a second one, described in docs/security-audit.md, carrying package names and versions and nothing else.
- One endpoint per client. Point Claude Code, Codex or Cursor at a single URL and manage the servers behind it from a web UI.
- Upstream OAuth that survives. Tokens are refreshed proactively on a schedule, not after a request already failed.
Status
Early, but the whole path works: gateway, aggregation, API key auth, a built-in OAuth authorization server, upstream OAuth, REST API, web UI, registry browsing, import from a pasted client config, a management MCP server and a multi-arch image on GHCR. Expect breaking changes before 1.0; CHANGELOG.md says when a release needs a fresh database.
Screenshots
Quickstart
The image is ghcr.io/k2so-dev/junctio, built for amd64 and arm64. latest is the last release, and every release is also tagged X.Y.Z and X.Y.
mkdir junctio && cd junctio
curl -fsSLO https://raw.githubusercontent.com/k2so-dev/junctio/main/compose.yml
curl -fsSL https://raw.githubusercontent.com/k2so-dev/junctio/main/.env.example -o .env
Set JUNCTIO_SECRET in .env to the output of openssl rand -hex 32, then start it:
docker compose up -d
Or run it straight from the source tree:
bun install
bun run build:web
JUNCTIO_SECRET=$(openssl rand -hex 32) bun run start
Open http://localhost:3000, set an admin password, then:
- Add a server. For a package on npm pick the
npxruntime and type the package name. The form previews the exact command. - Create a namespace and put the server in it.
- Create an endpoint pointing at that namespace and issue an API key.
- Paste the snippet into your client.
claude mcp add --transport http junctio https://mcp.example.com/mcp/main \
--header "Authorization: Bearer jn_..."
Behind a domain, set JUNCTIO_BASE_URL and JUNCTIO_TRUST_PROXY=true and terminate TLS in front of the gateway. The guides under Documentation do this for you.
Configuration
| Variable | Required | Meaning |
|---|---|---|
JUNCTIO_SECRET |
yes | Key used to encrypt stored tokens and headers. At least 32 characters; generate one with openssl rand -hex 32. The process refuses to start without it. |
JUNCTIO_BASE_URL |
for OAuth | Public URL of the gateway. Redirect URIs and resource identifiers are built from it. |
JUNCTIO_ADMIN_TOKEN |
no | Bearer token for headless admin access, as an alternative to the password login. Also the key to the management MCP server. When set, it is also required to choose the admin password on first start. |
JUNCTIO_OAUTH_ISSUER |
no | Issuer URL of an external identity provider. Leave it empty to use the gateway's own authorization server. |
JUNCTIO_OAUTH_AUDIENCE |
no | Override the expected audience of an external provider. Defaults to the endpoint URL. |
JUNCTIO_DATA_DIR |
no | Where junctio.db lives. Defaults to ./data. The image sets it to /data, which is a volume. |
JUNCTIO_DOCKER_SOCKET |
no | Socket of the daemon that runs docker servers. Defaults to /var/run/docker.sock. |
JUNCTIO_PUBLIC_DIR |
no | Directory of the built UI. Defaults to ./public, then ./apps/web/dist. |
JUNCTIO_TRUST_PROXY |
no | true reads the client address from x-forwarded-for. Only enable it behind a proxy that rewrites that header, otherwise rate limits can be bypassed. |
PORT / HOST |
no | Listener. Defaults to 3000 and 0.0.0.0. |
LOG_LEVEL |
no | debug, info, warn or error. Defaults to info. |
OAuth does not work without TLS. Browsers and MCP clients will refuse the redirects. Terminate TLS in front of the gateway. See docs/caddy.md.
Documentation
- Upstream servers: stdio runtimes, remote transports, servers that ship as an image, upstream OAuth
- Endpoints: aggregation, downstream auth, protocol negotiation, client compatibility
- Management MCP: let an agent configure the gateway instead of clicking through the UI
- Explore: the registry, the catalog of other sources, import from a pasted config
- Security audit: scheduled vulnerability checks and what a finding does
Deploy: Caddy on a VPS, Dokploy, Coolify, Portainer.
Development
bun install
bun test # unit and integration suites
bun run typecheck # tsc for the server, vue-tsc for the web
bun run dev # gateway with watch mode
bun run dev:web # vite dev server on 5173, proxies /api to 3000
bun run build:web # SPA into apps/web/dist, served by the gateway
bun run db:generate # regenerate drizzle migrations after a schema change
The UI is Vue 3, Tailwind 4 and shadcn-vue, built as a static SPA. The gateway serves it from apps/web/dist unless JUNCTIO_PUBLIC_DIR says otherwise.
The test suite covers the things the product claims: upstream refresh under a five second token lifetime with a hundred calls and zero client-visible failures, single-flight collapsing, refresh token rotation, fifty stdio restart cycles with no zombie processes, and 404 on the discovery documents of an API-key-only endpoint.
make help lists the same commands run in a throwaway toolchain container, plus make up, which builds junctio:local from the source tree and starts the stack through compose.build.yml.
Security
The gateway runs arbitrary packages and holds tokens for every integration you connect. Read SECURITY.md before exposing it to anyone but yourself.
License
MIT
Contributing
See CONTRIBUTING.md for the setup, the checks a pull request has to pass, and the repository layout. Report a vulnerability privately as described in SECURITY.md.
Junctio MCP 질문
Junctio가 사용자 데이터를 수집하나요?
아니요, 이 서버는 텔레메트리, 전화 홈(phone-home), 분석 기능을 포함하지 않습니다. 유일한 외부 호출은 Explore 페이지를 위한 공개 MCP registry 호출과 선택 사항인 보안 감사뿐입니다.
Junctio는 OAuth 토큰을 어떻게 처리하나요?
요청이 실패할 때까지 기다리는 대신, 토큰이 만료되지 않도록 정해진 일정에 따라 선제적으로 갱신합니다.