Skip to main content
Glama

openproject-mcp

A Model Context Protocol server for OpenProject. It gives an MCP-capable assistant read-only access to the projects, work packages and comments that one OpenProject API key can see.

Why this exists

OpenProject ships an official MCP server, but it is an Enterprise add-on: it requires an Enterprise cloud or on-premises plan at the Professional tier or above. Every Community Edition instance, and every openDesk deployment built on one, is left without a way to connect an assistant.

This server fills that gap. It talks to the documented, unrestricted API v3 that every OpenProject instance exposes, using a personal API key.

Related MCP server: MCP OpenProject Server

Scope and safety

Every tool in this server is read-only. There is no code path that creates, updates or deletes anything in OpenProject, and no tool that writes to disk or makes a request to any host other than the configured instance.

The server holds one API key and therefore sees exactly what the user behind that key sees. OpenProject's own project memberships and role permissions remain the access boundary; this server does not widen them.

Responses are size-capped before they reach the assistant. A single response body is read up to a limit and then aborted, and long descriptions and comments are truncated with an explicit [truncated] marker rather than silently cut.

Requirements

  • Node.js 20 or newer

  • An OpenProject instance reachable from the machine running the server

  • An OpenProject API key

Creating an API key

  1. Sign in to OpenProject.

  2. Open your avatar menu and choose "My account".

  3. Go to "Access tokens".

  4. Under "API", choose "Generate" and copy the key.

The key inherits your permissions. If you want the assistant to see less than you do, create a dedicated OpenProject user with narrower project memberships and generate the key as that user.

Installation

git clone https://github.com/Nraitschew/openproject-mcp.git
cd openproject-mcp
npm install
npm run build

The build writes an executable entry point to dist/index.js.

Configuration

The server is configured through environment variables. The host application that starts the server passes them in.

Variable

Required

Default

Meaning

OPENPROJECT_URL

yes

Instance URL, for example https://projects.example.org. A path prefix is kept, so an instance served under https://example.org/op works. https is added when the scheme is missing.

OPENPROJECT_API_KEY

yes

The API key from "My account", "Access tokens".

OPENPROJECT_TIMEOUT_MS

no

15000

Per-request timeout in milliseconds.

OPENPROJECT_MAX_RESPONSE_BYTES

no

4194304

Hard cap on a single response body.

OPENPROJECT_MAX_TEXT_CHARS

no

50000

Cap on a description or comment handed to the assistant.

A missing or malformed variable makes the server exit with a message on stderr that names the variable, rather than starting and failing on the first tool call.

Connecting a client

Claude Desktop

Edit the MCP configuration file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "openproject": {
      "command": "node",
      "args": ["/absolute/path/to/openproject-mcp/dist/index.js"],
      "env": {
        "OPENPROJECT_URL": "https://projects.example.org",
        "OPENPROJECT_API_KEY": "your-api-key"
      }
    }
  }
}

Restart Claude Desktop afterwards.

Claude Code

claude mcp add openproject \
  --env OPENPROJECT_URL=https://projects.example.org \
  --env OPENPROJECT_API_KEY=your-api-key \
  -- node /absolute/path/to/openproject-mcp/dist/index.js

Any other MCP client

The server speaks MCP over stdio. Start it with node dist/index.js and the two required environment variables set; any client that can spawn a stdio server will work.

Tools

Tool

Purpose

get_current_user

Identify the account the API key belongs to. Call this first when a question says "my" or "me".

list_projects

List visible projects, optionally filtered by name or identifier. Returns the ids that scope a work package search.

search_work_packages

Full-text search over work packages, optionally scoped to a project or to the current user. Defaults to open work packages, most recently updated first.

get_work_package

One work package in full, including its description.

get_work_package_comments

The comments on a work package. Status changes without a comment are omitted.

list_statuses

The work package statuses configured on the instance.

list_types

The work package types configured on the instance, for example Task, Bug, Milestone.

Tool results are JSON. Related resources are flattened out of OpenProject's HAL envelopes: a work package carries status, assignee and project as plain names rather than as link objects, so the assistant reads the work rather than the link structure.

Errors

A failing tool call returns a result marked as an error whose text starts with a stable machine code:

Code

Meaning

unauthorized

The API key was rejected. It may have been revoked.

forbidden

The key is valid but not permitted to read that resource.

not_found

No such work package, project or endpoint.

rate_limited

The instance is rate limiting this client.

unreachable

The instance did not answer, or the request timed out.

invalid_response

The response was not the expected document. Usually a wrong OPENPROJECT_URL.

http_error

Any other non-success status, with the status code in the message.

Testing against your instance

npx @modelcontextprotocol/inspector node dist/index.js

The MCP Inspector lists the tools and lets you call them by hand, which is the fastest way to confirm the URL and key are right.

Development

npm install
npm run typecheck
npm test
npm run build

The unit tests cover the configuration parsing and the API v3 filter grammar. They make no network requests, so they run anywhere.

Limitations

  • Read-only by design. Creating or updating work packages is not implemented.

  • Attachments are not downloaded.

  • Time and cost entries, budgets, and the BCF endpoints are not exposed.

  • search_work_packages sorts by last update and pages once. A very large result set is truncated to the requested limit rather than paged through.

  • opendesk-mcp connects a whole openDesk instance, including this server's OpenProject tools.

  • xwiki-mcp does the same for XWiki.

License

Apache License 2.0. See LICENSE.

This project is not affiliated with or endorsed by OpenProject GmbH. "OpenProject" is a trademark of its respective owner and is used here only to describe what this software connects to.

Available Tools

7 tools
get_current_userGet current userA

Identify the OpenProject account this server authenticates as. Call it first when a question says 'my' or 'me', then pass assignedToMe to search_work_packages.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It conveys that the operation is a read/identity lookup and adds the useful behavioral context of being a precursor to search_work_packages. However, it does not disclose output shape, possible errors, or whether authentication is required.

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 filler: the first states the purpose, the second gives a direct usage instruction. Every phrase 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?

For a zero-parameter tool, the description is nearly complete: it says what the tool does and when/how to use it. It omits details about the exact response format, but with no output schema that is a minor gap for such a simple identity-lookup tool.

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 tool has zero parameters, so the schema provides no parameter documentation. The description compensates by explaining the intended data flow into search_work_packages, which is more useful than any parameter description would be here.

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 uses a specific verb and resource ('Identify the OpenProject account this server authenticates as') and clearly distinguishes this from sibling tools by focusing on the authenticated identity rather than work packages or projects. It is not a tautology of the tool name.

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 explicitly states when to call the tool ('when a question says 'my' or 'me'') and how to use its result ('then pass assignedToMe to search_work_packages'). It lacks an explicit when-not-to-use statement or alternatives, but the guidance is clear and actionable for the common case.

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

get_work_packageGet work packageA

Read one work package in full, including its description, priority, author and progress. Get the id from search_work_packages first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork package id, for example 4711.

TDQS

A4.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only states 'Read', which implies a non-mutating operation, but does not disclose potential errors (e.g., invalid id), auth requirements, or response characteristics. Given the lack of annotation support, this is a significant gap.

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 two sentences, with the primary purpose front-loaded and the usage hint in a separate sentence. No filler or redundant phrasing; every part contributes to the agent's understanding.

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 single-parameter read operation with no output schema, the description adequately covers what it returns (full work package with specified fields) and how to get the id. It omits error handling details, but these are less critical for a straightforward fetch. Overall, it is sufficiently complete for the tool's complexity.

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?

Schema description coverage is 100% for the id parameter (with an example), and the description adds operational context by directing the agent to get the id from search_work_packages. This goes beyond the schema's static definition by explaining how to obtain a valid value, which is helpful for correct invocation.

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 reads one work package in full, listing specific fields (description, priority, author, progress). It distinguishes from sibling tools like search_work_packages (which searches) and get_work_package_comments (which fetches comments only) by focusing on full details of a single work package.

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

Usage Guidelines5/5

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

It explicitly instructs the agent to obtain the id from search_work_packages first, establishing a clear usage workflow. This also implies when to use this tool (after searching) and implicitly differentiates it from alternatives like search (for lists) or comments (for a subset of data).

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

get_work_package_commentsGet work package commentsA

Read the comments on one work package, oldest first. Status changes without a comment are omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork package id.
limitNoMaximum comments to return. Default 50.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It adds meaningful behavior—comments are ordered oldest first, and status changes without an accompanying comment are omitted—which goes beyond the tool name and helps an agent predict output.

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 short sentences deliver the essential behavior and constraints with no filler. The core purpose is front-loaded, and the ordering/filtering detail adds necessary specificity without bloat.

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 read-only tool with two well-documented parameters, the description is largely complete: it specifies scope, ordering, and an important filtering rule. It could mention the return shape slightly more explicitly, but the tool name and schema make this a minor gap.

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 schema already documents the 'id' and 'limit' parameters well. The description does not add parameter-specific meaning beyond referring to 'one work package,' so 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 uses a specific verb ('Read') and resource ('comments on one work package'), making the tool's purpose immediately clear. It also distinguishes itself from siblings like get_work_package by focusing on comments rather than the work package itself.

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 clear context: use this tool to read comments for a single work package. It does not explicitly mention alternatives or when-not-to-use, but the sibling tools are distinct enough that no exclusion is necessary.

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

list_projectsList projectsA

List the projects visible to this account, with id, name, identifier and description. Pass a returned id as projectId to search_work_packages to scope a search to one project.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum projects to return. Default 50.
queryNoFilter by name or identifier. Omit to list all visible projects.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description bears the burden of explaining behavior. It discloses account-scoped visibility, the expected output fields, and a downstream usage constraint. It does not explicitly state 'no side effects' or discuss rate limits, but for a list operation the core behavioral details are present.

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 filler: the first defines the operation and result fields, and the second connects the output to a sibling tool. The most important scope detail is front-loaded.

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?

For a simple two-optional-parameter list tool, the description plus schema fully covers what the agent needs: what is returned, scope visibility, and how to use the result downstream. No output schema is declared, but the stated fields are sufficient for calling the tool.

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?

The input schema already documents both parameters (limit and query) with 100% coverage, so the description need not repeat them. It also adds no parameter-specific nuance, keeping it at the baseline 3.

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 states a specific action and resource ('List the projects visible to this account') and names the returned fields. It also differentiates itself from the sibling search_work_packages by explaining that its returned id is the projectId for that tool.

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?

It gives clear context for when to call this tool: to see account-visible projects and obtain ids for scoped work-package searches. It does not explicitly enumerate exclusions or alternative tools, but the workflow pointer is concrete and actionable.

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

list_statusesList statusesA

List the work package statuses configured on this instance. Useful when a question names a status and you need to know whether it exists.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations exist, so the description carries the behavioral burden. The verb 'List' implies a read-only operation and 'configured on this instance' indicates instance-level data, but the description does not explicitly mention side-effect-free behavior, permissions, or return format. This is a minor gap for a zero-parameter list tool.

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 efficient sentences: the first states the core operation, the second gives a practical use case. There is no filler or redundancy.

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 zero-parameter list tool with no output schema and no annotations, the description covers what the tool does and when to invoke it. It could add more detail about the returned status shape, but that is not essential for deciding to call the tool; 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?

There are zero parameters, so the description has no parameter documentation burden. The baseline of 4 applies because nothing about parameters needs to be explained; all schema properties are already covered.

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?

States the specific action ('List') and exact resource ('work package statuses configured on this instance'). It is clearly distinguishable from sibling list tools like list_projects and list_types because it names the resource. No ambiguity.

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?

Provides a concrete trigger scenario: when a question names a status and the agent needs to verify whether it exists. It does not explicitly discuss when not to use it, but given the resource-specific siblings, the context is clear enough. This is adequate usage guidance.

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

list_typesList work package typesA

List the work package types configured on this instance, for example Task, Bug, Milestone.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations exist, so the description must carry behavioral weight. 'List' implies a read-only operation and 'configured on this instance' clarifies scope, but it does not explicitly state side-effect-free behavior or return format details.

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?

A single, front-loaded sentence contains the verb, resource, scope, and clarifying examples with no filler or repetition of the title.

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?

For a parameterless listing tool with no output schema, the description fully covers what the agent needs: it identifies the resource, the instance scope, and representative returned values. Nothing material is missing for correct invocation.

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 tool has zero parameters, which warrants a baseline of 4. The description adds context about what the output domain is (configured work package types) even though there are no input semantics to document.

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?

Description uses a specific verb ('List') and resource ('work package types configured on this instance') and gives concrete examples (Task, Bug, Milestone), which clearly separates it from siblings like list_projects and list_statuses.

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 read intent is implied: when an agent needs work package types, this is the obvious tool. However, the description does not explicitly state when to use it over alternatives such as list_statuses or list_projects, nor does it mention any exclusions.

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

search_work_packagesSearch work packagesA

Search work packages (tasks, bugs, milestones) by full text. Without a query it lists the most recently updated open ones. Returns id, subject, type, status, project, assignee and dates. Pass a returned id to get_work_package for the full description.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return. Default 25.
queryNoFull-text search across subject and description.
projectIdNoRestrict to one project, using an id from list_projects.
assignedToMeNoOnly work packages assigned to the account this server authenticates as.
includeClosedNoAlso return closed work packages. Default false.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does a good job: it states the query-less default, that only open items are listed unless includeClosed is set, and that full descriptions are intentionally deferred to another tool. It does not mention pagination or auth expectations, but neither is critical for a read-only search call.

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?

Three sentences, no filler, and the most important behavioral detail (query-less default) is front-loaded. Every sentence contributes either purpose, behavior, return content, or a routing pointer.

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?

Despite having no output schema, the description enumerates the returned fields and the follow-up path to get_work_package, which is enough for an agent to chain calls. It is not exhaustive about all sibling relationships or edge-case behaviors, but it is complete for the tool's core use.

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?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful value by explaining what happens when query is omitted—it lists the most recently updated open items—thus clarifying query's optionality and the implied ordering/filtering beyond what the schema states.

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 names a clear action ('Search work packages') and resource, then clarifies the kinds of entities included (tasks, bugs, milestones) and the full-text scope. It also distinguishes itself from get_work_package by noting it returns only summary fields and that details come from the sibling tool.

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 explains the default behavior when no query is given and explicitly routes the agent to get_work_package for full descriptions. It does not enumerate when to prefer other siblings like list_statuses or list_types, but the most important differentiation is present.

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

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct resource or action: current user, projects, work-package search, single work package, comments, statuses, and types. There is no meaningful overlap between search_work_packages and get_work_package because one is full-text search and the other is retrieval by ID.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: get_current_user, list_projects, search_work_packages, get_work_package, and so on. The one longer name, get_work_package_comments, still fits the established convention.

Tool Count5/5

Seven tools is a well-scoped size for a read-oriented OpenProject integration. Each tool has a clear purpose and none are redundant, so the count feels intentional rather than padded or thin.

Completeness2/5

The surface is entirely read-only: it can search, view, and list work packages, projects, comments, statuses, and types, but it cannot create, update, transition, or comment on work packages. For a project-management domain this is a significant functional gap that prevents agents from completing common workflows.

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

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/Nraitschew/openproject-mcp'

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