Skip to main content
Glama
N-Graves
by N-Graves

devto-mcp-server

A Model Context Protocol server for the Dev.to / Forem API.

Every one of Forem's 139 published operations is accounted for: 49 are reachable through this server, and the other 90 are listed with the reason they are not. That claim is checked by a test against Forem's own OpenAPI spec, so when Forem ships an endpoint the build goes red rather than the README quietly becoming untrue.

MIT licensed.

Install

npm install -g @nasdigitaluk/devto-mcp

Get an API key from dev.to → Settings → Extensions → API Keys.

{
  "mcpServers": {
    "devto": {
      "command": "devto-mcp",
      "env": { "DEVTO_API_KEY": "your-key-here" }
    }
  }
}

That is the whole setup. There is no account to register, no capability to grant and no service to run alongside it — the API key is the authorization.

Related MCP server: DevTo-MCP

Configuration

Variable

DEVTO_API_KEY

Required.

DEVTO_BASE_URL

Point at a self-hosted Forem instance. Defaults to https://dev.to.

MCP_READ_ONLY=1

Refuse anything that changes state.

MCP_NO_DESTRUCTIVE=1

Allow writes, refuse unpublishing.

Tools

Nine tools cover 49 operations. That ratio is deliberate: every tool's name and description is paid for in the model's context window on every turn, used or not, so the common path gets purpose-built tools and the long tail goes through one dispatcher.

Tool

devto_list_operations

Browse the catalogue, including what is excluded and why. Start here.

devto_call

Call any covered operation by id.

devto_get_me

The authenticated profile.

devto_list_my_articles

Your own articles. Defaults to all, see below.

devto_create_article

Create. Drafts unless you ask otherwise.

devto_update_article

Edit content. Never changes publish state.

devto_publish_article

Publish a draft. Its own tool, deliberately.

devto_unpublish_article

Take one down. Marked destructive.

devto_get_analytics

All eight of Forem's reports.

Three behaviours worth knowing

Listing your articles defaults to all. /articles/me returns published articles only. An account whose work is all drafts looks completely empty through it, which is exactly what happened in the server this was rewritten from — six real drafts, and the tool reported two articles.

Creating an article makes a draft. Publishing is immediate and public, so it is a decision rather than a default: pass published: true, or use devto_publish_article afterwards.

Editing never changes publish state. Publishing is a separate tool so that fixing a typo can never take a live article down, and unpublishing can never happen as a side effect of an edit.

What is excluded, and why

Forem's API is one spec serving both hosted dev.to and self-hosted instances, so a large part of it is for whoever operates the instance rather than whoever writes on it.

Excluded

Count

Why

Admin-tagged endpoints

26

Need an admin key on a self-hosted Forem.

Moderation actions

8

Suspend, spam, limited, trusted, unpublish-user. Forem tags these users, not admin, but they need moderator privileges an author key does not carry.

Segments, surveys, billboards, concepts

24

Instance features, administered by the operator.

Pages, events, subforems, recommendation lists

15

Instance structure.

Badge and organisation mutations

8

Minting a badge or creating an organisation is instance administration. The reads are covered.

Health checks

3

Report on the server, not on your account.

Agent sessions

5

Forem's own feature; unrelated to MCP.

The spec endpoint

1

Already vendored in this repo.

devto_list_operations with include_excluded: true gives the same information at runtime, per operation.

The exclusions are enforced rather than documented: asking devto_call for suspendUser returns the reason, not a 403 from Forem after the fact.

Refreshing the catalogue

curl -o vendor/forem-openapi.json \
  https://raw.githubusercontent.com/forem/forem/main/swagger/v1/api_v1.json
npm run generate
npm test

The coverage test names anything newly unclassified. Classify it in scripts/generate-operations.mjs and regenerate.

Testing

npm test                  # 21 tests
npm run build
node scripts/smoke.mjs    # real MCP over stdio, 9 checks

The smoke test is the one that matters. It speaks actual MCP to the built server with FLEET_BOARD_URL and OPENCLAW_MCP_AGENT_ID explicitly cleared, and asserts that no tool asks for an agent_id, that no private vocabulary appears in any description, and that a read tool works with nothing else running.

That is not hypothetical. This server was extracted from one where every write tool called a private task board at 127.0.0.1:8420 and failed closed — so cloned by anyone else, every write tool was permanently broken, and agent_id was a required field on all of them.

Built on

@nasdigitaluk/mcp-server-core — the hardened fetch layer, pluggable authorization, error sanitisation and coverage checking shared across this family of servers.

Licence

MIT.

Available Tools

9 tools
devto_callA

Call any operation listed by devto_list_operations. Use this for anything the purpose-built tools below do not cover.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoRequest body for POST, PUT and PATCH.
paramsNoPath and query parameters, by name.
operation_idYesFrom devto_list_operations, e.g. getArticles.

TDQS

A3.8/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 the full burden of behavioral disclosure. It does not mention that this tool can perform arbitrary actions with side effects, that responses vary by operation, or that authentication/rate limits may apply. The phrase 'call any operation' hints at generality but provides no concrete behavioral context.

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, each earning its place: the first states what the tool does, and the second states when to use it. The description is front-loaded and contains no fluff.

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

Completeness2/5

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

For a generic operation caller with no annotations and no output schema, the description is too thin. It lacks guidance on response formats, error behavior, side effects, or any operation-specific caveats. While it points to devto_list_operations, the description alone is not enough for an agent to fully anticipate the tool's behavior.

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 input schema already documents operation_id, params, and body. The description adds no parameter-specific meaning beyond referencing devto_list_operations as the source of operation IDs, so the baseline score 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 specifies a verb (call) and a resource (any operation listed by devto_list_operations), and explicitly distinguishes this generic fallback tool from the purpose-built siblings by saying it covers what they do not. This makes the tool's role immediately understandable.

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?

The description provides an explicit usage rule: use this tool for anything the purpose-built tools do not cover. This implies when not to use it (when a purpose-built tool applies) and points to the alternatives as a group.

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

devto_create_articleA

Create an article. Creates a DRAFT unless you explicitly pass published: true — publishing is a real, immediate, public action and should be a decision rather than a default.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoUp to four tags. Forem silently drops extras, so this refuses a fifth instead.
titleYesThe article title.
seriesNoSeries name; the same string groups articles.
publishedNofalse creates a draft. true publishes it immediately and publicly.
main_imageNoCover image. Must be a PUBLICLY REACHABLE URL - Forem fetches it server-side, so a local file path will not work.
descriptionNoThe preview snippet shown in feeds and social cards. Omit it and Forem derives one from the opening of the body, which is usually a truncated first sentence.
body_markdownYesThe article body, in Forem-flavoured markdown.
canonical_urlNoOriginal URL when cross-posting from elsewhere.
organization_idNoPublish under an organisation you belong to.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It excellently surfaces the two most important behaviors: articles are drafts by default, and passing `published: true` triggers a real, immediate, public action. It does not mention response details or edge-case behaviors, but the key side-effect risk is transparently disclosed.

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 deliver exactly the essential information with no filler. The primary action is stated first, followed by the critical default-behavior warning. Every word 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 create operation with nine parameters, the rich schema descriptions and the tool description together provide enough context to invoke the tool correctly. The description does not cover the response format, but with no output schema present this is a modest gap rather than a blocking one.

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 all nine parameters well. The description adds meaningful emphasis around the `published` parameter's default and side effects, but it does not materially extend the semantic information already present in the schema.

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 opens with 'Create an article,' a specific verb and resource pair, and then sharpens the scope with a critical default: it creates a DRAFT unless `published: true` is passed. This clearly differentiates it from publication-oriented siblings and leaves no ambiguity about what the tool does.

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 gives clear context that this tool creates articles and that publishing should be an explicit decision, but it does not explicitly state when to prefer this tool over alternatives like `devto_update_article` or `devto_publish_article`. The usage guidance is implied rather than spelled out.

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

devto_get_analyticsA

Author analytics. All eight reports Forem publishes are available; totals and past_day need no date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoYYYY-MM-DD.
startNoYYYY-MM-DD, for the ranged reports.
reportYes

TDQS

A3.8/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 disclosure burden. It adds useful behavioral context by noting that all eight reports are available and that only totals and past_day can omit a date range. However, it does not describe response behavior, authorization needs, or the different nature of the reports beyond their names.

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 with no wasted words. The primary resource is front-loaded and the most important parameter condition is stated immediately. It is concise while still carrying useful information.

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

Completeness3/5

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

The description is adequate for basic invocation but sparse given an 8-valued enum, no output schema, and no annotations. It does not explain what each report type returns or how date ranges apply to each ranged report, though the enum names and schema descriptions provide partial guidance.

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 describes start and end fields with date format, but the report parameter only has an enum. The description adds meaningful parameter semantics by stating that totals and past_day do not need a date range, which clarifies when start and end are relevant. This goes beyond the schema coverage of 67%.

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

Purpose4/5

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

The description names the resource ('Author analytics') and the name includes the verb 'get', clearly signaling a retrieval operation. It is differentiated from sibling tools because none of the listed siblings target analytics, though it does not explicitly contrast with them.

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 tool's intended use is clear: retrieve author analytics. It also provides a conditional guideline ('totals and past_day need no date range'), which helps the agent decide what inputs to supply. No explicit exclusions or alternatives are mentioned, but no competing analytics sibling exists.

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

devto_get_meB

The authenticated user's own profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/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 of behavioral disclosure. It implicitly communicates a read-only operation by describing a profile retrieval, and the phrase 'authenticated user' hints that auth is required. However, it never explicitly states that the operation is a safe read, what authentication is needed, or any limits on response content — though for a zero-parameter retrieval, the disclosure burden is minimal.

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 six-word sentence with zero filler. Every word contributes meaning — 'authenticated' scopes the user, 'own' distinguishes from other users' profiles, and 'profile' identifies the resource. This is appropriately minimal for a zero-parameter tool.

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

Completeness3/5

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

Given the very low complexity (0 params, no output schema, no annotations), the description is nearly sufficient but leaves gaps an agent might want filled: it doesn't specify what fields the profile response contains, explicitly state that authentication is required, or note that this can serve as an identity check before other calls. With no output schema to compensate, a sentence or two about the return payload would make it complete.

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 there is no parameter meaning for the description to add beyond the schema. Per the baseline for 0-parameter tools, the description is not expected to document anything here, and the schema already fully covers the empty parameter set.

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

Purpose4/5

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

The description names the exact resource ('the authenticated user's own profile') and the scope (own, not others'), which distinguishes it from sibling tools like devto_list_my_articles, devto_get_analytics, and devto_publish_article. It lacks an explicit verb like 'Get' or 'Retrieve', reading as a noun-phrase label rather than an action statement, but the resource is unambiguous and no sibling returns the user's profile.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives — it never mentions devto_list_my_articles or devto_get_analytics, nor any exclusion criteria. The intended use is weakly implied by the name and resource, but an agent is given no explicit routing help or context about when this call is the right choice.

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

devto_list_my_articlesA

List your own articles. Defaults to ALL of them: /articles/me returns published articles only, so a drafts-only account looks empty through it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
stateNoall
per_pageNo

TDQS

A3.9/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 burden of behavioral disclosure. It adds valuable context by explaining that the tool defaults to ALL articles, unlike the raw /articles/me endpoint which returns only published articles, preventing an agent from misinterpreting an empty result for drafts-only accounts.

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 short and front-loaded with the core purpose. The second sentence is slightly convoluted but still earns its place by conveying an important behavioral nuance without unnecessary filler.

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

Completeness3/5

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

The tool is simple with three optional parameters and no output schema, so the description is adequate in some respects. However, it does not describe what each state returns, pagination behavior, or the response shape, which leaves gaps given the lack of annotation and output schema support.

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

Parameters2/5

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

The schema has 0% description coverage, so the description must compensate. It only touches the 'state' parameter indirectly by mentioning 'ALL', but provides no information about 'page' or 'per_page'. The schema already defines the defaults and enum values, so the description adds minimal semantic value beyond the structured definition.

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 verb and resource ('List your own articles') and distinguishes this tool from potential siblings by limiting scope to the authenticated user's articles. It also clarifies the default behavior, making the purpose unambiguous.

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 for when to use the tool: when retrieving the caller's own articles. It does not explicitly mention when not to use it or name alternatives, but the sibling list contains no other article-list tool, so the context is sufficient.

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

devto_list_operationsA

Browse the 139 operations in the Forem/Dev.to API — 49 reachable through this server and 90 excluded, each with the reason why. Call this first to find the operation id for devto_call.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFilter by id, path, tag or summary. Omit to list everything.
include_excludedNoAlso show operations this server cannot reach, and why.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It explains that this is a browse/discovery operation, enumerates the 139 operations split into 49 reachable and 90 excluded with reasons, and indicates that operation ids are returned. It could explicitly state that it executes no API operations, but the verb 'browse' and the stated purpose make that clear enough.

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 zero filler. The core facts about what the tool lists and why are front-loaded, followed by the actionable instruction to call it first. 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?

Because there is no output schema, the description must indicate what the caller receives, and it does: a browsable list of 139 operations with operation ids and exclusion reasons. It does not spell out the exact return shape or pagination, but for a discovery tool with optional filters this is nearly 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?

The schema already documents both parameters with 100% coverage, so the baseline is 3. The description adds helpful context around include_excluded by mentioning the 49 reachable and 90 excluded operations, but it does not materially extend the meaning of search. No compensation is needed since the schema carries the parameter semantics.

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 a specific purpose: browse the 139 operations in the Forem/Dev.to API and find the operation id needed for devto_call. The resource and action are explicit, and this is distinctly a discovery tool rather than one of the execution sibling tools.

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 explicit usage context with "Call this first to find the operation id for devto_call," which tells the agent when this tool should be used. It does not spell out when not to use it, but no rival discovery tool exists among the siblings, so the context is sufficient.

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

devto_publish_articleA

Publish an existing draft. This makes it publicly visible immediately. Kept as its own tool rather than a field on devto_update_article so that editing a typo can never change an article's publish state by accident.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe draft's article id.

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses the key behavioral trait that publishing makes the article publicly visible immediately, which is valuable. However, it does not mention authorization requirements, failure behavior for non-draft ids, or whether the operation can be reversed.

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 concise and front-loaded: it states the action first, then the consequence, and then the design rationale. Each sentence earns its place and the rationale directly supports tool selection.

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 one-parameter tool with no output schema, the description covers what the tool does, its immediate effect, and why it is separated from a sibling. It could mention the reverse operation or expected response, but the essentials are present.

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%, and the only parameter id is described as 'The draft's article id.' The description adds no additional parameter semantics, so the baseline of 3 applies.

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 verb and resource: publish an existing draft, and clarifies the immediate effect (publicly visible). It also explicitly distinguishes itself from devto_update_article, which helps an agent identify the intended tool without confusion.

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 why this tool exists as a separate action from devto_update_article, giving a clear reason to prefer it for publishing. It does not explicitly mention when to use devto_unpublish_article as the reverse operation, but the context is otherwise clear.

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

devto_unpublish_articleA

Take a published article down. It becomes a draft again rather than being deleted — Forem has no delete-article endpoint at all, so nothing here can destroy an article.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.2/5.0
Behavior4/5

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

The description goes beyond the bare action by disclosing the key behavioral consequence: the article becomes a draft rather than being deleted. It also adds an important safety detail that no article can be destroyed through this endpoint. Since no annotations are provided, this extra disclosure carries meaningful weight.

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 sentence that front-loads the core action ('Take a published article down') and then immediately provides the most important behavioral nuance. There is no filler, repetition, or unnecessary detail.

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 one-parameter tool with no output schema and no annotations, the description covers the essential context: what action is performed and what the result is. It does not discuss ownership requirements or failure behavior, but given the simplicity of the operation, the provided information is sufficient for correct invocation.

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 schema has one simple 'id' integer parameter, and the description does not explicitly map it to the article ID. The tool name and description strongly imply that id is the published article's ID, so it is minimally adequate, but the description does not add direct parameter-level clarification beyond what the schema already shows. With 0% schema description coverage, a bit more explicit parameter guidance would have been better.

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: 'Take a published article down.' It clearly distinguishes this from deletion by stating the article becomes a draft again, which also separates it from sibling tools like publish_article and update_article. The purpose is immediately obvious.

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 makes the usage context clear: use this when a published article should be made a draft. It also provides an implicit exclusion by noting there is no delete-article endpoint, so this tool is not a deletion mechanism. It does not explicitly name sibling alternatives, but the context is strong enough for an agent to infer when to invoke it.

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

devto_update_articleA

Edit an existing article. Omitted fields are left alone; the publish state is never changed here — use devto_publish_article or devto_unpublish_article for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe article id.
tagsNoUp to four tags. Forem silently drops extras, so this refuses a fifth instead.
titleNoThe article title.
seriesNoSeries name; the same string groups articles.
main_imageNoCover image. Must be a PUBLICLY REACHABLE URL - Forem fetches it server-side, so a local file path will not work.
descriptionNoThe preview snippet shown in feeds and social cards. Omit it and Forem derives one from the opening of the body, which is usually a truncated first sentence.
body_markdownNoThe article body, in Forem-flavoured markdown.
canonical_urlNoOriginal URL when cross-posting from elsewhere.
organization_idNoPublish under an organisation you belong to.

TDQS

A4.4/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 full behavioral burden. It discloses a key partial-update semantic ('Omitted fields are left alone') and an important non-behavior ('publish state is never changed'), which goes beyond typical update descriptions. It does not detail error cases or auth requirements, but the most decision-relevant behaviors are covered.

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 deliver the core purpose, the partial-update behavior, and the alternative tools with zero filler. The most important scoping constraint (publish state) is placed where it is easy to notice.

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 9-parameter mutation tool with no annotations, the description plus a 100%-covered schema gives an agent enough to call it correctly. It lacks an explicit pointer to devto_create_article for new articles and does not describe the response, but those are minor against the strong parameter schema and clear sibling differentiation.

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 every parameter. The description adds the general behavior that omitted fields are untouched, which meaningfully informs parameter usage, but it does not add per-parameter detail. This matches the baseline for fully documented schemas.

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: 'Edit an existing article.' It clearly distinguishes this tool from devto_create_article ('existing'), devto_publish_article, and devto_unpublish_article, making its purpose unambiguous.

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?

Explicitly states when NOT to use this tool: 'the publish state is never changed here' and names the exact alternatives, devto_publish_article and devto_unpublish_article. This gives an agent clear routing criteria without needing to inspect sibling tools.

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. 9 tool updatesv1.0.0
    • First observeddevto_call
    • First observeddevto_create_article
    • First observeddevto_get_analytics
    • First observeddevto_get_me
    • First observeddevto_list_my_articles
    • First observeddevto_list_operations
    • First observeddevto_publish_article
    • First observeddevto_unpublish_article
    • First observeddevto_update_article

TDQS

A4.1/5.0
Disambiguation5/5

The purpose-built tools each target a distinct action/resource: profile, own articles, create/update/publish/unpublish, and analytics. devto_call is explicitly scoped to operations not covered by the purpose-built tools, so its overlap is intentional and clear.

Naming Consistency4/5

All tools share the devto_ prefix and use snake_case, mostly following a verb_noun pattern. The only notable deviation is devto_call, which is a verb without an explicit object, but this is minor and still predictable in context.

Tool Count5/5

9 tools is a well-scoped set: seven focused article/profile/analytics operations plus a discovery/call pair that prevents the surface from needing dozens of purpose-built tools. Each tool earns its place.

Completeness5/5

The set covers the core article lifecycle—create, list, update, publish, unpublish—plus profile and analytics, and explicitly documents why delete is not available. The devto_list_operations/devto_call pair also provides access to all other reachable Forem API operations, so no major gaps remain.

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

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/N-Graves/devto-mcp-server'

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