Combined MCP Server
Provides tools for interacting with Git repositories, including status, diff, commit, log, branch listing/creation/switching, and showing commits.
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., "@Combined MCP Servershow me the current git status"
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.
Combined MCP Server
A self-hosted MCP (Model Context Protocol) server that gives AI agents controlled access to a machine: filesystem, shell, background processes, git, web fetching and persistent key-value memory. Works over Streamable HTTP, SSE or stdio.
Tools
Filesystem
Tool | Description |
| Read a file |
| Write a file (parent directories are created automatically) |
| Replace an exact string in a file; preserves file permissions, fails if the match is ambiguous |
| List directory contents |
| Grep-like regex search ( |
| Find files by glob pattern ( |
Shell & processes
Tool | Description |
| Run a command via |
| Start a long-running background process (dev server, build) |
| List background processes or inspect one |
| Read captured stdout+stderr (ring buffer, 200 KB per process) |
| Send a signal to a background process (default |
Git
All git tools accept a repository directory (path/cwd) and default to the server working directory. Arguments are passed to git without a shell, so commit messages and paths cannot inject commands.
Tool | Description |
|
|
|
|
|
|
| Recent commits, optionally for one path |
| List, create or switch branches |
| Show a commit (message + diff, or |
Images
Pixel work is done with Pillow through python3 (override the interpreter with MCP_PYTHON). Both tools return MCP image content, so a model can actually look at the result, plus a JSON line with the measurements.
Tool | Description |
| View an image file: optional |
| Compare two images: mean ( |
Web & memory
Tool | Description |
| Fetch a URL and convert HTML to Markdown |
| Persistent key-value memory ( |
Related MCP server: mcp-devtools
Quick start
npm install
node index.js # SSE on http://localhost:8000/sse
PORT=9000 node index.js # custom port
USE_STDIO=true node index.js # stdio transport instead of HTTPTransports
Mode | Endpoints | Start |
|
|
|
| Streamable HTTP only: |
|
| Legacy SSE only: |
|
| stdin/stdout |
|
--transport <mode> on the command line overrides MCP_TRANSPORT. Streamable HTTP is stateful
(mcp-session-id header); sessions idle for 30 min are dropped (MCP_HTTP_SESSION_IDLE_MS).
Auth (static tokens and OAuth) applies to both HTTP transports; in clients use https://<host>/mcp for
Streamable HTTP and https://<host>/sse for SSE.
Security
Authentication (fail-closed)
Token auth for the HTTP endpoints turns on automatically as soon as at least one active token exists in tokens.json. MCP_REQUIRE_AUTH=1 forces auth on even with no tokens (rejects everything); MCP_REQUIRE_AUTH=0 disables auth explicitly:
# create tokens (any number, with TTL or forever)
node scripts/token.js create --name laptop --ttl 30d
node scripts/token.js create --name ci --count 5 --ttl 12h
node scripts/token.js create --name main # never expires
node scripts/token.js list
node scripts/token.js revoke laptop # by name or by token value
node index.js # auth is now enforced because active tokens existClients pass the token as Authorization: Bearer <token> or ?token=<token> in the SSE URL (many SSE clients cannot set headers). Tokens live in tokens.json (chmod 600; override with MCP_TOKENS_FILE). The file is re-read on every request, so revocation takes effect immediately without a restart.
OAuth 2.1 (Dynamic Client Registration + Authorization Code with PKCE)
For clients that connect via OAuth (Notion custom MCP connections, Claude, ChatGPT, MCP Inspector) the server is also a full OAuth 2.1 authorization server. Enable it by setting the public URL of the server:
MCP_PUBLIC_URL=https://mcp.example.com MCP_OAUTH_PASSWORD='long-random-secret' node index.jsThen add https://mcp.example.com/sse in the client and choose either option:
OAuth 2.0 (Dynamic Client Registration): nothing else to fill in, the client registers itself at
/register.OAuth 2.0 (Authorization Code + PKCE): register a client once and paste its
client_idinto the client (curl -X POST https://mcp.example.com/register -H 'content-type: application/json' -d '{"client_name":"Notion","redirect_uris":["<redirect URI shown by the client>"],"token_endpoint_auth_method":"none"}'). Authorization URL:/authorize, token URL:/token, scope:mcp.
When the client opens /authorize, a consent page asks for the owner secret: MCP_OAUTH_PASSWORD
or any active token from tokens.json. Approving issues an access token (1 h) and a refresh token (30 d, rotated on
every use).
Endpoint | Purpose |
| Protected Resource Metadata (RFC 9728), advertised in |
| Authorization Server Metadata (RFC 8414) |
| Dynamic Client Registration (RFC 7591) |
| Authorization Code + PKCE (S256 only), consent page |
|
|
| Token revocation (RFC 7009) |
With OAuth enabled, auth is always enforced. Static tokens keep working alongside OAuth tokens.
Variable | Default | |
| unset | Public https URL; enables OAuth (http is allowed only for localhost) |
| unset |
|
| unset | Owner secret for the consent page |
|
| Clients and hashed tokens (chmod 600) |
|
| Token lifetimes, seconds |
|
| Express |
node scripts/oauth.js list # registered clients and live tokens
node scripts/oauth.js revoke <client> # drop a client and all its tokens
node scripts/oauth.js revoke-allPath allowlist (opt-in)
Restrict filesystem and git tools to specific directories:
MCP_ALLOWED_DIRS="/home/user/projects:/tmp" node index.jsWhen unset, file tools can access everything the server user can (a warning is logged).
Known limitations
executeShellandstartProcessare not sandboxed: a shell command can touch anything the server user can, regardless ofMCP_ALLOWED_DIRS. Disable or firewall them if you expose the server beyond localhost.The allowlist does not resolve symlinks pointing outside allowed directories.
Prefer binding behind a reverse proxy with TLS when exposing the server to a network.
Configuration
Env var | Default | Meaning |
|
| HTTP port for SSE mode |
| unset |
|
| auto |
|
|
| Token storage location |
| unset | Colon-separated allowlist for file/git tools |
| unset |
|
|
| Bypass level (1 to 5) for tool masking under |
Tests
node test/smoke.mjs # token manager + live auth checks
node test/image-tools.test.mjs # readImage + compareImages (needs Pillow)CI runs syntax checks and the smoke test on every push/tag (.woodpecker.yml, Codeberg Woodpecker).
NixOS
nix develop # shell with nodejs + git
npm install
nix run .#server # or just: node index.jsThis server cannot be deployed
Maintenance
Related MCP Connectors
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Related MCP Servers
- AlicenseBqualityCmaintenanceA local-first MCP server that provides AI agents with safe codebase access through file discovery, hybrid lexical-semantic search, and project introspection. It features durable local memory and semantic indexing while keeping all data and processing entirely on your local machine.7480 npm6MIT
- AlicenseBqualityDmaintenanceProduction-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.1533 npm3MIT
- AlicenseNot gradedqualityAmaintenanceSelf-hosted MCP server giving AI agents persistent memory for personalization and context across conversations.143 PyPI281Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA free, open-source MCP server that gives AI agents real filesystem, terminal, git, and process control over your machine for inspection, diagnosis, and repair.MIT