Skip to main content
Glama
peteroyce

devscope-mcp

by peteroyce

devscope-mcp

An MCP server that exposes a read-only view of GitHub to Claude and other Model Context Protocol clients. Seven tools cover repository metadata, pull request summaries, issue lists, code search, contributor statistics, and a seven-day activity digest.

License Python

Features

  • Seven MCP tools registered over stdio, each with a full JSON input schema so the client can validate arguments before a call is made.

  • Read-only by construction: every GitHub call goes through a small PyGithub wrapper that exposes no write operations.

  • Search-query sanitisation — boolean operators and qualifier prefixes (repo:, language:, org:, user:, path:, and others) are stripped from model-supplied search text, so a query cannot silently widen its own scope.

  • Results are rendered as compact plain text rather than raw JSON, which keeps tool output cheap to read for the model.

  • Blocking PyGithub calls are dispatched to a thread executor, so the asyncio event loop running the MCP session is never stalled by network I/O.

  • Errors are returned as tool text, classified into invalid-request, configuration, and GitHub-API categories, instead of tearing down the session.

  • get_contributor_stats distinguishes "no contributors" from "GitHub is still computing the statistics" (GitHub answers HTTP 202 while the cache warms).

  • Optional GITHUB_DEFAULT_ORG so tools that accept an org argument can be called without one.

Related MCP server: mcp-github-server

Architecture

MCP client (Claude Desktop, or any stdio MCP host)
        │  JSON-RPC over stdio
        ▼
src/server.py
   ├── TOOLS[]            tool names, descriptions, JSON input schemas
   ├── _TOOL_HANDLERS{}   name → handler; argument coercion and validation
   ├── run_in_executor    blocking GitHub work moved off the event loop
   ├── _fmt_*()           dict → human/model-readable text
   └── error mapping      ValueError → invalid request
                          EnvironmentError → configuration error
                          RuntimeError → GitHub API error
        │
        ▼
src/github_client.py      PyGithub wrapper. Returns plain dicts and lists only,
                          so no PyGithub object ever reaches the server layer.
        │
        ▼
GitHub REST API           authenticated with GITHUB_TOKEN

Keeping the client layer free of PyGithub types is what makes the server layer testable: the test suite substitutes plain dictionaries and never touches the network.

Quickstart

Requires Python 3.11+ and a GitHub personal access token. The token needs repo, read:org, and read:user scopes for private repositories and organisation listings.

python -m venv .venv
source .venv/bin/activate          # Windows: .venv\Scripts\activate
pip install -e ".[dev]"

cp .env.example .env               # set GITHUB_TOKEN, optionally GITHUB_DEFAULT_ORG

Variable

Required

Purpose

GITHUB_TOKEN

yes

Personal access token; a blank value raises at the first tool call

GITHUB_DEFAULT_ORG

no

Default organisation for tools that accept org

Register the server with Claude Desktop by adding an entry to mcpServers in claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):

{
  "mcpServers": {
    "devscope-mcp": {
      "command": "devscope-mcp",
      "env": { "GITHUB_TOKEN": "ghp_..." }
    }
  }
}

devscope-mcp is the console script declared in pyproject.toml. If you would rather not install the package, use "command": "python", "args": ["-m", "src.server"], and set "cwd" to the checkout directory. Restart the client after editing the config.

Tools

Tool

Required arguments

Returns

list_repos

— (org, limit optional; default 20, max 100)

Repos sorted by most recent push: name, visibility, language, stars, open issues, URL

get_repo_info

owner, repo

Description, language, stars, forks, open issues, topics, default branch, timestamps

summarize_pr

owner, repo, pr_number

Title, state, author, base/head branches, changed files with line deltas, conversation comments, commit count

list_issues

owner, repo (state, limit optional)

Issues only — pull requests are filtered out — with labels, assignees, comment counts

search_code

query (repo optional)

Up to 20 code results: repository, path, URL

get_contributor_stats

owner, repo

Per contributor: total commits, lines added and deleted, active weeks, sorted by commits

get_weekly_digest

owner, repo

Last 7 days: merged PRs, opened issues, closed issue count, top 5 contributors

The repo argument to search_code is checked against owner/repo and then appended as a trusted repo: qualifier — it is the only qualifier the server will add.

Example prompts once the server is connected:

"Give me the changed files and review comments for PR #47 in myorg/payments"

"List the open issues in peteroyce/devscope-mcp"

"Show me the weekly digest for myorg/backend"

Tech stack

Python 3.11+ · mcp (stdio server) · PyGithub · python-dotenv · Hatchling · pytest, pytest-asyncio, pytest-mock

Testing

pytest -v

tests/test_github_client.py and tests/test_server.py mock every PyGithub call, so the suite runs without a token or network access. asyncio_mode = "auto" is set in pyproject.toml. GitHub Actions runs the same command on Python 3.11 (.github/workflows/ci.yml).

License

MIT — see LICENSE.

Available Tools

5 tools
get_repo_infoA

Get detailed metadata for a specific GitHub repository: description, language, stars, forks, open issues, topics, default branch, visibility, and creation / last-update timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name.
ownerYesRepository owner (user or org login).

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It lists the returned fields but does not explicitly state that the operation is read-only, nor does it mention authentication, rate limits, or any side effects. The description is insufficiently transparent about the tool's behavior beyond the return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that lists the key metadata fields. It is front-loaded with the tool's purpose and efficiently conveys the scope. Every part of the sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has low complexity with two simple parameters. The description lists the return fields, which is helpful. However, it does not mention error conditions, authentication requirements, or data format details. Overall, it provides sufficient context for a basic read tool but lacks some nuance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description does not add additional meaning beyond what the schema already provides for the 'owner' and 'repo' parameters. It only reiterates that the tool gets metadata for a specific repository.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'detailed metadata for a specific GitHub repository', listing the specific metadata fields. This distinguishes it from sibling tools like list_repos (which lists repos) and search_code (which searches code).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that the tool should be used when detailed metadata for a specific repo is needed, but it does not provide explicit guidance on when to use this tool versus alternatives like list_repos or summarize_pr. No exclusions or when-not-to-use instructions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_issuesA

List issues for a repository. Supports filtering by state (open / closed / all). Returns issue number, title, labels, assignees, author, comment count, and a truncated body.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name.
limitNoMaximum number of issues to return (default 10).
ownerYesRepository owner.
stateNoFilter issues by state (default: open).open

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions truncation of the body and lists return fields, but does not discuss pagination, ordering, or authentication requirements. Adequate but could be more comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-crafted sentence that front-loads the primary action and succinctly adds filtering and return information. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool, the description covers purpose, filtering, and key return fields. It does not mention pagination or sorting, but these are partially addressed by the limit parameter and schema. Overall, fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover all parameters (100% coverage). The description adds context about return fields and mentions state filtering, but does not add new meaning to parameters beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and the resource 'issues for a repository'. It specifies the returned fields, distinguishing it well from siblings like list_repos or get_repo_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing issues by state, but does not explicitly state when not to use it or mention alternatives like a detailed issue retrieval tool. However, context from sibling tools makes the purpose clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reposA

List repositories for a GitHub organisation or the authenticated user. Returns repo names, descriptions, primary language, star counts, and open issue counts sorted by most recently pushed.

ParametersJSON Schema
NameRequiredDescriptionDefault
orgNoGitHub organisation login. If omitted, lists repos for the authenticated user.
limitNoMaximum number of repos to return (default 20, max 100).

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the output is sorted by most recently pushed and lists returned fields. It does not explicitly state it is read-only or mention auth needs, but the behavior is adequately implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The purpose is stated first, followed by details, making it front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately describes the output fields. It covers both parameters, the sorting behavior, and the two use cases. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage, but the description adds value by explaining the 'org' parameter's behavior (if omitted, lists for authenticated user) and confirms the 'limit' parameter's default and maximum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists repositories for a GitHub organization or the authenticated user, and lists the returned fields (names, descriptions, language, stars, issues). This distinguishes it from siblings like get_repo_info and list_issues.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use (list repos for an org or the authenticated user) and implies the use case via the 'org' parameter. However, it does not explicitly mention when not to use or compare with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_codeA

Search code across GitHub using GitHub's code-search syntax. Optionally restrict the search to a specific repository. Returns file name, path, repository, and a link to each result.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNoOptional 'owner/repo' string to restrict the search to one repo.
queryYesGitHub code-search query, e.g. 'authenticate user language:python'.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions the return fields (file name, path, repository, link) and query syntax, but omits important details like pagination, rate limits, or authentication requirements, which are critical for an AI agent to use the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no fluff. Front-loaded with the core action, followed by optional restriction and return information. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a relatively simple two-parameter tool, the description adequately covers the what and the return format. However, it lacks information on result limits or pagination, which would be valuable for completeness given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter descriptions. The description adds minimal extra meaning: it reinforces the repo parameter's purpose and mentions the search syntax, but these are already implied by the schema. The baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches code across GitHub using GitHub's code-search syntax, specifying the resource (code) and action (search). It distinguishes well from sibling tools like list_repos and get_repo_info, which focus on repositories rather than code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives usage context by noting the optional repo restriction, but does not explicitly compare to alternatives or provide when-not-to-use guidance. However, sibling tools are distinct enough that the purpose alone differentiates usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_prA

Return a comprehensive summary of a pull request: title, description, state, author, base/head branches, list of changed files with line deltas, all conversation comments, and aggregate addition / deletion counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesRepository name.
ownerYesRepository owner.
pr_numberYesPull request number.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full burden for behavioral disclosure. It describes the output but does not mention any behavioral traits such as error handling, permission requirements, or side effects. The read-only nature is implied but not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded with the main purpose. It efficiently lists what is returned, though it could be broken into bullet points for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately explains the return value with a comprehensive list of included details. It covers most aspects a user would need, though it could mention error cases or pagination if applicable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema; it only describes the output, not the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a comprehensive summary of a pull request and lists specific details (title, description, state, author, branches, changed files, comments, deltas). It distinguishes itself from sibling tools that deal with repos, issues, or code search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for obtaining a detailed PR summary but does not explicitly state when to use it versus alternatives like list_issues or get_repo_info. No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_repo_info
    • First observedlist_issues
    • First observedlist_repos
    • First observedsearch_code
    • First observedsummarize_pr

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct GitHub resource (repos, PRs, issues, code search) with no overlap in purpose, ensuring clear differentiation.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (list_repos, get_repo_info, summarize_pr, list_issues, search_code) using underscores.

Tool Count5/5

5 tools is a well-scoped set for a GitHub-focused MCP server, covering key operations without excess.

Completeness3/5

Covers reading and searching but lacks create/update/delete operations for repos, issues, and PRs, which are common CRUD gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives Claude Desktop complete intelligence about any public GitHub repository. Research libraries, compare packages, audit dependencies, and explore codebases through natural conversation.
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A working MCP server that connects to the real GitHub API, enabling users to manage repositories, issues, pull requests, and more through natural language in Claude Desktop.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A self-hosted MCP server that gives Claude access to your GitHub account — read files, browse repos, commit changes, and manage issues and pull requests, all from a conversation.
    467
    ISC

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/peteroyce/devscope-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server