MCP Servers

ๆจกๅž‹ไธŠไธ‹ๆ–‡ๅ่ฎฎๆœๅŠกๅ™จใ€ๆก†ๆžถใ€SDK ๅ’Œๆจกๆฟ็š„็ปผๅˆ็›ฎๅฝ•ใ€‚

๐Ÿ”’ A safe-by-default, beginner-friendly hub for MCP servers. Connect AI IDEs like Claude Desktop and Cursor to real-world developer tools. Read-only by desig

ๅˆ›ๅปบไบŽ 5/27/2026
ๆ›ดๆ–ฐไบŽ about 3 hours ago
Repository documentation and setup instructions

๐Ÿ”’ mcp-server-hub

A safe-by-default, beginner-friendly hub for MCP (Model Context Protocol) servers that connect AI coding assistants to real-world developer tools.

Give your AI IDE โ€” Claude Desktop, Cursor, Windsurf, or any MCP client โ€” read-only access to GitHub repositories, issues, pull requests, and source files. No write operations. No risk.

Key Features

  • ๐Ÿ›ก๏ธ Read-only by design โ€” every tool is strictly read-only. No creates, no deletes, no mutations.
  • ๐Ÿ”‘ Secret-safe โ€” tokens are never logged, never leaked in errors, and automatically redacted.
  • โœ… Input validation โ€” all inputs validated with Zod before any API call.
  • ๐Ÿงฉ Plug and play โ€” one command to build, one config block to connect.
  • ๐Ÿ“– Beginner-friendly โ€” clean code, clear docs, and a simple project structure.

Table of Contents


Available Servers

| Server | Description | Status | |--------|-------------|--------| | github-helper | Read-only access to GitHub repos, issues, PRs, and files | โœ… v0.1.0 | | supabase-helper | Supabase database and auth inspection | ๐Ÿ—“๏ธ Planned | | vercel-helper | Vercel deployment and project info | ๐Ÿ—“๏ธ Planned | | cloudflare-helper | Cloudflare Workers and DNS info | ๐Ÿ—“๏ธ Planned |

Only github-helper is implemented. Future servers are planned but not yet built.


Tech Stack

  • Language: TypeScript (strict mode)
  • Runtime: Node.js 18+
  • Package Manager: pnpm (workspace monorepo)
  • Validation: Zod
  • Environment: dotenv
  • MCP SDK: @modelcontextprotocol/sdk
  • Transport: Stdio (local subprocess โ€” no network server needed)

Prerequisites

Before starting, make sure you have:


Getting Started

1. Clone the Repository

git clone https://github.com/kwaqtech/mcp-server-hub.git
cd mcp-server-hub

2. Install Dependencies

pnpm install

This installs all dependencies across the monorepo (shared utilities + github-helper server).

3. Build

pnpm build

This compiles TypeScript to JavaScript for all packages. The compiled output goes to dist/ in each package.

4. Configure Your GitHub Token

cp servers/github-helper/.env.example servers/github-helper/.env

Edit servers/github-helper/.env and replace the placeholder:

GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

๐Ÿ’ก Tip: Use a fine-grained token with read-only access to public repos. This is the safest option.

5. Test It Locally

Run the server directly to verify it starts:

node servers/github-helper/dist/index.js

You should see [INFO] github-helper MCP server starting... on stderr. Press Ctrl+C to stop. If you see an error about GITHUB_TOKEN, double-check your .env file.


Connect to Your AI IDE

Claude Desktop

  1. Open your Claude Desktop config file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
  2. Add the github-helper server:

{
  "mcpServers": {
    "github-helper": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-server-hub/servers/github-helper/dist/index.js"],
      "env": {
        "GITHUB_TOKEN": "your_token_here"
      }
    }
  }
}
  1. Replace /absolute/path/to/mcp-server-hub with the actual path on your system.
  2. Replace your_token_here with your GitHub Personal Access Token.
  3. Restart Claude Desktop.

Cursor

  1. Open Cursor Settings โ†’ MCP Servers, or edit .cursor/mcp.json in your project:
{
  "mcpServers": {
    "github-helper": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-server-hub/servers/github-helper/dist/index.js"],
      "env": {
        "GITHUB_TOKEN": "your_token_here"
      }
    }
  }
}
  1. Restart Cursor or reload the MCP configuration.

Verify the Connection

Once connected, try asking your AI assistant:

  • "What is the description of the facebook/react repo?"
  • "Show me the open issues on nodejs/node"
  • "Get the README from modelcontextprotocol/typescript-sdk"
  • "List the pull requests on vercel/next.js"
  • "Show me the contents of package.json in expressjs/express"

Tool Reference

github_get_repo_info

Get metadata about a GitHub repository.

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | owner | string | โœ… | Repository owner (user or organization) | | repo | string | โœ… | Repository name |

Returns: Repository name, URL, description, language, stars, forks, open issues, watchers, default branch, creation date, license, topics, and archive/private status.


github_get_readme

Fetch the raw README content of a repository.

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | owner | string | โœ… | Repository owner | | repo | string | โœ… | Repository name |

Returns: The full README text (markdown).


github_list_issues

List issues in a repository with optional filters. Automatically excludes pull requests.

| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | owner | string | โœ… | โ€” | Repository owner | | repo | string | โœ… | โ€” | Repository name | | state | "open" | "closed" | "all" | โ€” | "open" | Filter by issue state | | labels | string | โ€” | โ€” | Comma-separated label names | | per_page | number (1โ€“100) | โ€” | 10 | Results per page | | page | number | โ€” | 1 | Page number |

Returns: Issue number, title, state, author, labels, comment count, creation date, and URL for each issue.


github_list_pull_requests

List pull requests in a repository with optional state filter.

| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | owner | string | โœ… | โ€” | Repository owner | | repo | string | โœ… | โ€” | Repository name | | state | "open" | "closed" | "all" | โ€” | "open" | Filter by PR state | | per_page | number (1โ€“100) | โ€” | 10 | Results per page | | page | number | โ€” | 1 | Page number |

Returns: PR number, title, state, draft status, author, branch info, creation/merge date, and URL.


github_get_file_content

Read the content of a file from a repository.

| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | owner | string | โœ… | โ€” | Repository owner | | repo | string | โœ… | โ€” | Repository name | | path | string | โœ… | โ€” | File path (e.g., src/index.ts) | | ref | string | โ€” | default branch | Branch, tag, or commit SHA |

Returns: The raw file content as text.


Architecture

Project Structure

mcp-server-hub/
โ”œโ”€โ”€ AGENTS.md                        # AI agent rules (source of truth)
โ”œโ”€โ”€ README.md                        # This file
โ”œโ”€โ”€ SECURITY.md                      # Security policy & vulnerability reporting
โ”œโ”€โ”€ CONTRIBUTING.md                  # Contribution guidelines
โ”œโ”€โ”€ LICENSE                          # MIT License
โ”œโ”€โ”€ package.json                     # Root monorepo scripts
โ”œโ”€โ”€ pnpm-workspace.yaml              # Defines packages/* and servers/* workspaces
โ”œโ”€โ”€ tsconfig.base.json               # Shared strict TypeScript configuration
โ”œโ”€โ”€ .gitignore                       # Ignores node_modules, dist, .env
โ”œโ”€โ”€ .env.example                     # Root env template
โ”‚
โ”œโ”€โ”€ docs/                            # Documentation
โ”‚   โ”œโ”€โ”€ getting-started.md
โ”‚   โ”œโ”€โ”€ claude-desktop.md
โ”‚   โ”œโ”€โ”€ cursor.md
โ”‚   โ”œโ”€โ”€ security-guide.md
โ”‚   โ””โ”€โ”€ troubleshooting.md
โ”‚
โ”œโ”€โ”€ packages/
โ”‚   โ””โ”€โ”€ shared/                      # @mcp-server-hub/shared
โ”‚       โ”œโ”€โ”€ package.json
โ”‚       โ”œโ”€โ”€ tsconfig.json
โ”‚       โ””โ”€โ”€ src/
โ”‚           โ”œโ”€โ”€ index.ts             # Barrel export
โ”‚           โ”œโ”€โ”€ env.ts               # Safe env loading + Zod validation
โ”‚           โ”œโ”€โ”€ logger.ts            # stderr logger with secret redaction
โ”‚           โ”œโ”€โ”€ errors.ts            # Typed error classes (safe messages)
โ”‚           โ””โ”€โ”€ responses.ts         # MCP response builders
โ”‚
โ””โ”€โ”€ servers/
    โ””โ”€โ”€ github-helper/               # @mcp-server-hub/github-helper
        โ”œโ”€โ”€ package.json
        โ”œโ”€โ”€ tsconfig.json
        โ”œโ”€โ”€ README.md
        โ”œโ”€โ”€ .env.example
        โ””โ”€โ”€ src/
            โ”œโ”€โ”€ index.ts             # Entry point โ€” McpServer + stdio transport
            โ”œโ”€โ”€ config.ts            # Zod-validated GITHUB_TOKEN config
            โ”œโ”€โ”€ github-client.ts     # Read-only GitHub REST API client
            โ””โ”€โ”€ tools/
                โ”œโ”€โ”€ get-repo-info.ts
                โ”œโ”€โ”€ get-readme.ts
                โ”œโ”€โ”€ list-issues.ts
                โ”œโ”€โ”€ list-pull-requests.ts
                โ””โ”€โ”€ get-file-content.ts

How It Works

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     stdio      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    HTTPS     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  AI IDE      โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  github-helper    โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ  โ”‚  GitHub API  โ”‚
โ”‚  (Claude,    โ”‚   MCP JSON     โ”‚  MCP Server       โ”‚   GET only   โ”‚  api.github  โ”‚
โ”‚   Cursor)    โ”‚                โ”‚                    โ”‚              โ”‚  .com        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  1. Your AI IDE launches the server as a subprocess.
  2. Communication happens over stdio using the MCP JSON protocol.
  3. When the AI calls a tool, the server validates input with Zod.
  4. The server makes a read-only GET request to the GitHub REST API.
  5. The response is formatted as structured text and returned to the AI.
  6. All logging goes to stderr (never to stdout, which is reserved for MCP).

Key Design Decisions

| Decision | Rationale | |----------|-----------| | McpServer (high-level API) | Official recommended class from @modelcontextprotocol/sdk. Handles capability negotiation automatically. | | Stdio transport | Standard for local MCP servers. No HTTP server to configure or expose. | | All logging to stderr | MCP uses stdout for protocol messages. Any stdout pollution breaks the protocol. | | Automatic secret redaction | The logger detects and redacts GitHub PAT patterns (ghp_*, github_pat_*, etc.) in any log message. | | Safe error classes | Error messages never contain raw upstream details. toSafeError() wraps unknown errors into generic messages. | | Zod for everything | Config validation and tool input schemas both use Zod for consistent, declarative validation. |

Shared Package (@mcp-server-hub/shared)

Reusable utilities shared across all servers:

| Module | Purpose | |--------|---------| | env.ts | loadEnv(), requireEnv(), validateEnv() โ€” safe env loading that never exposes values in errors | | logger.ts | logInfo(), logWarn(), logError(), logDebug() โ€” logs to stderr with automatic token redaction | | errors.ts | NotFoundError, AuthError, RateLimitError, UpstreamError, toSafeError() โ€” typed, safe errors | | responses.ts | textResponse(), errorResponse() โ€” consistent MCP tool response format |


Environment Variables

Required

| Variable | Description | How to Get | |----------|-------------|------------| | GITHUB_TOKEN | GitHub Personal Access Token | github.com/settings/tokens |

Token Permissions Guide

| Use Case | Recommended Token Scope | |----------|------------------------| | Public repos only | No scopes needed (or public_repo for classic tokens) | | Private repos | repo scope (classic) or fine-grained with read-only repo access |

Important Rules

  • โŒ Never commit .env files (already in .gitignore)
  • โŒ Never hardcode tokens in source code
  • โœ… Use .env.example as a template โ€” it only contains placeholders
  • โœ… When configuring in AI IDEs, pass tokens via the env config field

Available Scripts

Run these from the repository root:

| Command | Description | |---------|-------------| | pnpm install | Install all dependencies across the monorepo | | pnpm build | Compile TypeScript for all packages and servers | | pnpm typecheck | Type-check all packages without emitting files | | pnpm lint | Run linting across all packages (not yet configured) | | pnpm test | Run tests (not yet configured) |

Run these from servers/github-helper/:

| Command | Description | |---------|-------------| | pnpm start | Start the compiled github-helper server | | pnpm build | Compile this server only | | pnpm typecheck | Type-check this server only |


Security

Security Model

All v0.x servers follow these rules:

  • โœ… Every tool is read-only โ€” no tool can create, modify, or delete anything
  • โœ… All inputs are validated with Zod before any API call
  • โœ… Tokens are loaded from environment variables, never hardcoded
  • โœ… Error messages are sanitized โ€” they never contain tokens, headers, or stack traces
  • โœ… The logger automatically redacts known secret patterns (GitHub PATs, Bearer tokens)
  • โœ… All API calls use HTTPS
  • โœ… No data is stored, cached, or forwarded beyond the MCP response

Forbidden Operations

These tool patterns are strictly forbidden in v0.x:

delete_*    update_*    create_*    merge_*    execute_*
run_shell   run_command push_commit write_file edit_file

Reporting Vulnerabilities

See SECURITY.md for responsible disclosure instructions.


Troubleshooting

"GITHUB_TOKEN is required"

Your .env file is missing or empty. Copy the template and add your token:

cp servers/github-helper/.env.example servers/github-helper/.env
# Edit .env and add your token

"Cannot find module" when starting

The project hasn't been built. Run:

pnpm build

Server not appearing in Claude Desktop

  • Make sure you restarted Claude Desktop after editing the config.
  • Verify the path to dist/index.js is absolute, not relative.
  • Confirm node is in your system PATH.

401 Unauthorized / 403 Forbidden

  • Your token may be expired โ€” regenerate at github.com/settings/tokens.
  • You may have hit the API rate limit (5,000 requests/hour). Wait and retry.
  • Private repos require a token with repo scope.

404 Not Found

  • Check for typos in the owner/repo name.
  • The file path doesn't exist in that repository.
  • Private repos require proper token permissions.

For more, see docs/troubleshooting.md.


Roadmap

  • [x] github-helper โ€” read-only GitHub MCP server
  • [ ] Add ESLint for consistent code style
  • [ ] Add unit tests for tools and shared utilities
  • [ ] supabase-helper โ€” read-only Supabase inspection
  • [ ] vercel-helper โ€” read-only Vercel deployment info
  • [ ] cloudflare-helper โ€” read-only Cloudflare Workers/DNS info

Contributing

See CONTRIBUTING.md for development setup and guidelines.

Quick version:

git clone https://github.com/kwaqtech/mcp-server-hub.git
cd mcp-server-hub
pnpm install
pnpm build

All contributions must follow the read-only security model. Do not submit write-capable tools.


License

MIT โ€” see LICENSE.

ๅฟซ้€Ÿ่ฎพ็ฝฎ
ๆญคๆœๅŠกๅ™จ็š„ๅฎ‰่ฃ…ๆŒ‡ๅ—

ๅฎ‰่ฃ…ๅŒ… ๏ผˆๅฆ‚ๆžœ้œ€่ฆ๏ผ‰

npx @modelcontextprotocol/server-mcp-server-hub

Cursor ้…็ฝฎ (mcp.json)

{ "mcpServers": { "kwaqtech-mcp-server-hub": { "command": "npx", "args": [ "kwaqtech-mcp-server-hub" ] } } }