devto-mcp
Allows browsing, searching, and reading DEV.to articles, comments, user profiles, and tags, as well as creating, updating, and listing articles for the authenticated user via the DEV.to API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@devto-mcpWhat are the top articles on Rust this week?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DEV.to MCP Server π
A Model Context Protocol (MCP) server for DEV.to (Forem API) built with Python and FastMCP.
This server enables AI assistants (Antigravity, Claude Desktop, Cursor, etc.) to browse, search, and read DEV.to articles, inspect comments and user profiles, explore tags, and publish or update draft and live articles.
β¨ Features
Public Tools (No API Key Required):
π° List & Filter Articles: Browse by tags, author username, status (
fresh,rising), or top timeframe.π Latest Articles: Stream recent publications.
π Full Article Reading: Fetch complete article metadata and raw Markdown body by article ID.
π Search: Natural query ranking over DEV.to content and tags.
π¬ Discussion & Comments: Read threaded comment trees for any article or comment ID.
π€ User Profiles: Inspect public user bios, social handles, and publication statistics.
π·οΈ Tags: Explore trending and popular community tags.
Authenticated Tools (Requires
DEVTO_API_KEY):π Draft & Publish Articles: Create new articles directly from chat in draft or published mode.
βοΈ Update Articles: Modify article titles, Markdown content, or publishing status.
π My Articles: List private draft and published articles with view and reaction stats.
π Account Details: Query the authenticated user's private profile.
Related MCP server: devto-mvp-server
π οΈ Installation & Setup
1. Clone & Set Up Environment
cd /path/to/devto-mcp
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install package and dependencies in editable mode
pip install -e ".[dev]"2. Configure API Key (Optional for Read Operations)
To publish articles or view your own drafts, generate an API key from: π DEV Settings -> Extensions -> DEV Community API Keys
Copy .env.example to .env and set your key:
cp .env.example .envDEVTO_API_KEY=your_devto_api_key_hereπ Client Configurations
Antigravity IDE Setup
Add the following to your Antigravity MCP configuration (e.g. ~/.gemini/antigravity/mcp/devto.json or project MCP config):
{
"mcpServers": {
"devto": {
"command": "/path/to/devto-mcp/.venv/bin/python",
"args": ["/path/to/devto-mcp/src/server.py"],
"env": {
"DEVTO_API_KEY": "your_devto_api_key_here"
}
}
}
}Claude Desktop Setup
In ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"devto": {
"command": "/path/to/devto-mcp/.venv/bin/python",
"args": ["/path/to/devto-mcp/src/server.py"],
"env": {
"DEVTO_API_KEY": "your_devto_api_key_here"
}
}
}
}Cursor Setup
In Cursor Settings -> Features -> MCP:
Name:
devtoType:
commandCommand:
/path/to/devto-mcp/.venv/bin/python /path/to/devto-mcp/src/server.py
π§° Available MCP Tools
Tool | Access | Description |
| Public | List & filter articles by |
| Public | Get the latest articles in reverse chronological order. |
| Public | Fetch full article metadata and raw Markdown body by integer |
| Public | Search articles by text |
| Public | Fetch nested discussion comments for an |
| Public | Fetch a specific comment thread by |
| Public | Fetch user bio, social handles, and metadata by |
| Public | List popular tags with descriptions and colors. |
| Auth | List authenticated user's articles by |
| Auth | Fetch authenticated user's account details. |
| Auth | Create a draft or published article with title, markdown body, tags, series, etc. |
| Auth | Update an existing article's title, body, publication status, or tags. |
π§ͺ Running Tests
Run the test suite using pytest:
.venv/bin/pytest -vπ‘οΈ Privacy, Anonymization & Public Showcase
This project is built from the ground up to be 100% safe for public articles, tutorials, video demos, and open source showcases:
Local Secrets Stay Local: Credentials like
DEVTO_API_KEYare stored in.env, which is strictly ignored by.gitignore. No private keys or tokens will ever be committed to version control.Built-in Showcase / Demo Mode (
DEVTO_DEMO_MODE=true): If you are recording a video, writing an article, or taking screenshots, you can enable Demo Mode to return realistic synthetic data (anonymized author profile@demo_author, mock drafts, safe simulated publishing) without needing an API key or modifying production DEV.to accounts:# Enable Demo Mode via environment variable DEVTO_DEMO_MODE=true python -m src.serverAutomated Showcase Script: Run the bundled demonstration script to execute and print all core tool interactions with sanitized outputs:
python scripts/demo.py
π License
MIT
Available Tools
12 toolsdevto_create_articleA
Create a new article on DEV.to as a draft or published post. Requires DEVTO_API_KEY.
Args: title: Title of the article. body_markdown: Full article body formatted in Markdown. published: True to publish immediately, False to save as a private draft (default False for safety). tags: Optional list of up to 4 tags (e.g. ['python', 'tutorial', 'webdev']). series: Optional series name to group this article under. canonical_url: Optional canonical URL if this article was cross-posted from another blog. description: Optional brief summary/meta description. main_image: Optional URL for cover/hero image.
Returns: Details and link to the created article or draft.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | Yes | ||
| series | No | ||
| published | No | ||
| main_image | No | ||
| description | No | ||
| body_markdown | Yes | ||
| canonical_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden of behavioral disclosure. It reveals the auth requirement, the draft-vs-published side effect, and the safety rationale for defaulting published to False. It does not cover rate limits or errors, but the provided context is meaningful and goes beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and auth requirement are front-loaded, followed by a compact, scannable Args block. Every parameter earns its explanation and there is no filler or redundancy, despite the large number of parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with eight parameters and no annotations, the description covers required fields, optional fields, authentication, and return shape. The output schema exists, so the 'Returns details and link' line is sufficient. Missing error semantics are a minor gap that does not impede correct selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by documenting all eight parameters with functional meaning: Markdown body, immediate publish flag, up to 4 tags, series grouping, canonical URL purpose, meta description, and hero image URL. This is far richer than the bare schema names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new article on DEV.to'. It clarifies the two modes, draft or published, and the word 'new' distinguishes it from update operations. This is not a tautology and clearly communicates the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creating articles that do not yet exist and mentions the DEVTO_API_KEY prerequisite. However, it never explicitly contrasts this tool with devto_update_article or states when not to use it. An agent must infer the boundary from the word 'new' and the sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_articleA
Fetch the full article details and complete Markdown body by its ID.
Args: article_id: The integer ID of the DEV.to article (found in URLs or list_articles).
Returns: Full article content in Markdown format including title, metadata, and body.
| Name | Required | Description | Default |
|---|---|---|---|
| article_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 correctly indicates a read operation ('Fetch') and describes the response as Markdown with title, metadata, and body. However, it does not mention what happens for invalid or nonexistent IDs, auth requirements, or rate limits, leaving some uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured into a one-line summary followed by Args and Returns. There is no filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 one parameter and an output schema, the description covers the core information: purpose, ID source, and return format. The main omissions are edge-case behavior like 404 handling and whether authentication is required, but these are minor for a straightforward fetch-by-ID operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining that article_id is an integer, what it represents (the DEV.to article ID), and where to find it (URLs or list_articles). This is sufficient for an agent to correctly populate the only parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb ('Fetch'), a specific resource ('full article details and complete Markdown body'), and the unique selection mechanism ('by its ID'). This clearly distinguishes it from sibling list/search tools, which operate without a single article ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states that this tool is for fetching one article by ID and even tells the agent where to obtain the ID ('found in URLs or list_articles'). It does not explicitly name alternative tools for searching or listing, but the intended usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_commentA
Fetch a specific comment thread by comment ID.
Args: comment_id: The ID code of the comment (e.g. '3e3k4').
Returns: The comment content and any sub-replies.
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. 'Fetch' implies a read-only operation, and 'Returns' clarifies the output, but it does not explicitly state non-destructiveness, authentication requirements, or any side effects. It is not misleading, but it leaves some behavioral context unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with clear sections: purpose, args, returns. The key purpose is front-loaded, and every sentence adds value with no redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with a single parameter and an output schema present. The description covers the purpose, the parameter, and the return content. It does not mention error cases or rate limits, but these are not critical for a straightforward fetch, making it adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It provides a definition of comment_id and an example format ('3e3k4'), which adds meaning beyond the schema's bare parameter name. This adequately informs the agent about the expected input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Fetch') and a specific resource ('specific comment thread by comment ID'), which distinguishes it from the sibling devto_get_comments (plural). The phrase 'specific' and 'by comment ID' makes the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus devto_get_comments or other siblings. The description only implies single-comment retrieval via 'specific', but it does not mention that plural retrieval or listing should use devto_get_comments. This leaves the agent to infer the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_commentsB
Fetch threaded discussion comments for a DEV.to article.
Args: article_id: Integer ID of the DEV.to article.
Returns: Formatted discussion thread with nested comment replies.
| Name | Required | Description | Default |
|---|---|---|---|
| article_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 that the tool fetches comments and returns a formatted discussion thread with nested replies, which implies a read-only operation. However, it does not mention authentication requirements, rate limits, or error handling, which could be relevant for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with the purpose in the first sentence followed by Args and Returns sections. No unnecessary words are present, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema present, the description provides sufficient context by stating the return format. It does not discuss error conditions or edge cases, but given the simplicity, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description restates the parameter as 'Integer ID' with no additional semantics. Since schema coverage is 0%, the description should provide context like the format of the ID or how to find it, but it does not, leaving the parameter meaning only as the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and the resource 'threaded discussion comments for a DEV.to article', which is specific and distinct from the singular 'devto_get_comment' sibling. It avoids tautology and gives the agent a clear idea of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 the sibling 'devto_get_comment' or other article-related tools. It does not mention exclusions or alternatives, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_latest_articlesA
Get the latest published articles on DEV.to ordered chronologically.
Args: page: Pagination page number (default 1). per_page: Number of articles to return (1-30, default 10).
Returns: Formatted markdown list of the most recent articles.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses that results are ordered chronologically, limited to published articles, and returned as a formatted markdown list. It omits auth and rate-limit details, but for a simple public GET these are minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well organized: one purpose sentence followed by a short Args/Returns block. Every line adds useful information with no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with an output schema, it covers the essential invocation details and return format. However, it lacks any guidance for choosing it over overlapping siblings, and with no annotations it does not address auth or rate limits, leaving some contextual gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates: it explains that page is a pagination page with default 1 and gives per_page a range (1-30) and default 10. This is meaningfully more informative than the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence clearly names the action ('Get') and the resource ('latest published articles on DEV.to') and adds the ordering ('chronologically'). However, it does not explicitly differentiate this from siblings like devto_list_articles or devto_search_articles, so it stops just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as devto_list_articles, devto_search_articles, or devto_get_article. The description explains mechanics but not selection criteria, exclusions, or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_meA
Fetch current authenticated user's account details and private settings. Requires DEVTO_API_KEY.
Returns: Details about the currently authenticated user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It states that it requires DEVTO_API_KEY and returns details about the authenticated user, which is useful. However, it does not disclose whether this is a read-only operation (though 'Fetch' implies it), rate limits, or what 'private settings' includes. The description adds some context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action and resource. The 'Requires DEVTO_API_KEY' note is placed early, and the return-value section is brief. It earns its place, though the 'Returns:' section is slightly redundant with the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has zero parameters and an output schema exists, the description is largely complete. It identifies the resource, the authentication requirement, and the return type. It could mention that this is a read-only operation or contrast with public profile fetching, but for a zero-parameter tool, the description covers the essential context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 semantics to rely on. The description compensates by clarifying that the tool operates on the authenticated user's context (via DEVTO_API_KEY) and returns account details and private settings. This gives the agent enough understanding of what the tool does without needing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and the resource 'current authenticated user's account details and private settings', which distinguishes it from sibling tools like devto_get_user_profile (which fetches public profiles) and devto_get_my_articles (which fetches articles). It could be slightly stronger by explicitly naming a sibling it is not, but the resource scope is specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it requires authentication (DEVTO_API_KEY) and is for the authenticated user's own data. However, it does not explicitly state when to use this tool versus alternatives like devto_get_user_profile, nor does it mention exclusions or prerequisites beyond the API key. The context is clear but not fully elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_my_articlesA
List articles created by the authenticated user. Requires DEVTO_API_KEY.
Args: status: Filter by status: 'all', 'published', or 'unpublished' (drafts). Default 'all'. page: Pagination page (default 1). per_page: Articles per page (1-30, default 10).
Returns: List of the authenticated user's articles including draft status.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| status | No | all | |
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly states the auth requirement, that it returns drafts, and that the status filter affects published/unpublished/drafts. It does not cover rate limits or errors, but for a simple read operation this is quite transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, front-loading the core purpose and auth requirement before organizing parameters under 'Args' and return under 'Returns'. Every sentence adds useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter authenticated listing tool with an output schema, the description covers auth, parameter semantics, and the list/draft behavior. It would be slightly stronger with explicit sibling guidance, but nothing critical is missing for the tool to be called correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully document parameters. It does: status has explicit allowed values ('all', 'published', 'unpublished'), page has a default, and per_page has a range (1-30) and default. This exceeds what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List articles') and a specific resource ('created by the authenticated user'), which clearly differentiates it from siblings like devto_list_articles or devto_search_articles. The inclusion of 'Requires DEVTO_API_KEY' further identifies the tool's function as user-scoped.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this for the authenticated user's articles, not for general article listing. However, it does not explicitly name alternatives or state when not to use this tool, leaving the agent to infer the distinction from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_tagsA
List popular tags on DEV.to.
Args: page: Pagination page number (default 1). per_page: Number of tags to return (1-50, default 25).
Returns: List of popular tags with their descriptions and color badges.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'List' and the returns line make clear this is a read-only operation, which is useful. However, it does not disclose details like whether the result is sorted by popularity, how pagination behaves beyond page numbers, or any rate-limit/auth considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by a clean Args/Returns structure. Every sentence earns its place, and there is no redundant fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with an output schema, the description is adequate and actionable. It documents both parameters and the return concept. It could be slightly more complete with sorting or pagination behavior, but nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description fully compensates. It explains page as 'Pagination page number' and per_page as 'Number of tags to return (1-50, default 25)', adding meaning beyond the raw schema types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List popular tags on DEV.to.' It clearly distinguishes itself from sibling tools, which all deal with articles, comments, or user profiles rather than tags. The scope is immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you need popular DEV.to tags. It does not explicitly mention when not to use it, but the sibling tools cover different resources, so there is no real alternative for tag listing. No exclusions are needed for this simple read operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_get_user_profileA
Fetch public profile details and statistics for a DEV.to user.
Args: username: DEV.to username handle (e.g. 'ben'). user_id: Alternatively, the integer ID of the user.
Returns: Formatted profile summary including bio, social links, and joined date.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | ||
| username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It does state that the operation is a public read and gives a sense of the return format ('Formatted profile summary including bio, social links, and joined date'). However, it does not disclose what happens when neither username nor user_id is provided, whether both are accepted at once, or how errors are handled, especially since the schema marks both parameters as optional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well organized into Args and Returns sections. It front-loads the purpose and contains no filler, with every sentence contributing useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple public profile fetch, the description covers the action, both parameters, and the general return contents. An output schema exists, so detailed return fields need not be repeated. The main gaps are the missing explicit requirement/precedence of the two parameters and no mention of devto_get_me for current-user lookups, but these are minor for a read-only lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters, and it does: username is defined as a DEV.to handle with an example, and user_id is explained as the integer alternative. The word 'Alternatively' signals an either/or relationship, though it does not clarify that the schema treats both as optional or define precedence if both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch public profile details and statistics for a DEV.to user.' It clearly identifies the tool's target (public user profile) and distinguishes it from sibling tools like devto_get_me by the word 'public.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for public user profiles and mentions two parameter alternatives, but it never explicitly states when to use this tool versus alternatives such as devto_get_me for the current user. The 'public' qualifier is the only implicit usage signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_list_articlesA
List articles from DEV.to with optional filters.
Args: tag: Filter by tag (e.g. 'python', 'webdev', 'ai'). username: Filter by specific author username (e.g. 'thepracticaldev'). state: Article state: 'fresh' (recently published), 'rising' (trending), or 'all'. top: Filter top articles by timeframe in days (e.g. 1 for today, 7 for week, 30 for month, 365 for year). page: Pagination page number (default 1). per_page: Number of articles to return (1-30, default 10).
Returns: Formatted markdown list of article summaries.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| top | No | ||
| page | No | ||
| state | No | ||
| per_page | No | ||
| username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 mention the return format ('Formatted markdown list of article summaries') and implies pagination via page and per_page parameters. However, it does not state whether the operation is read-only, any authentication requirements, rate limits, or error behavior. It provides some behavioral context but is incomplete for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an Args section and a Returns section, making it easy to scan. It is front-loaded with the main purpose in the first sentence. The parameter explanations are concise yet informative, each on its own line. It is appropriately sized for six parameters, though it could be slightly more compact by grouping related filters, but it is not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has six optional parameters and an output schema (not shown), so the description must provide sufficient context. It explains all filters and the return format, but it lacks information about edge cases (e.g., empty results), how to combine filters, or when to use this tool vs. siblings. It also does not mention any prerequisites or side effects. The description is adequate for a simple listing tool but has gaps in usage guidance and error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must fully explain each parameter. It does this excellently: every parameter (tag, username, state, top, page, per_page) is described with examples, allowed values, and defaults. For instance, state is explained with 'fresh', 'rising', or 'all', and top is described as a timeframe in days with examples. This adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List articles from DEV.to with optional filters', specifying the verb (list) and resource (articles). It is clear, but it does not differentiate from sibling tools like devto_search_articles or devto_get_latest_articles, which also list articles in some form. The purpose is evident, but the lack of sibling distinction prevents a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 its siblings. It does not mention alternatives like devto_search_articles for keyword-based queries or devto_get_latest_articles for recent articles. There is no explicit 'use this for X, use that for Y' guidance, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_search_articlesA
Search for DEV.to articles matching a text query or tag.
Args: query: Search keywords or phrase (searches title and description). tag: Optional tag filter (e.g. 'python', 'docker'). per_page: Number of matching results to return (1-20, default 10).
Returns: List of matching articles.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| query | Yes | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 does disclose that the query searches title and description and that it returns a list, which are helpful behavioral details. However, it does not mention any rate limits, authentication requirements, or potential error conditions. Since it is a read-only search, the lack of side-effect disclosure is less critical, but the description could be richer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an Args/Returns format, and every sentence adds information. It front-loads the purpose and keeps parameter details succinct. No redundant text, though it could be slightly more concise by omitting the 'Returns' line since an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 3 parameters and an output schema, the description covers the essentials: what each parameter does, the required nature of 'query', and the return type. It lacks details on error handling or pagination behavior beyond the per_page parameter, but given the simplicity of the tool and the output schema, it is sufficiently complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so excellently: it explains the meaning of 'query' (searches title and description), gives examples for 'tag' (e.g., 'python', 'docker'), and specifies the valid range and default for 'per_page' (1-20, default 10). This adds substantial value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (search) on DEV.to articles with optional query and tag filters. It distinguishes itself from siblings like devto_list_articles by emphasizing the search aspect, though it doesn't explicitly contrast with them. The verb 'Search' and resource 'DEV.to articles' make 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like devto_list_articles or devto_get_latest_articles. An agent could confuse it with listing all articles. The description does not mention that this is for keyword/tag-based search and not for general listing, nor does it suggest when one might prefer list_articles.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devto_update_articleA
Update an existing article or draft on DEV.to. Requires DEVTO_API_KEY.
Args: article_id: The integer ID of the article to update. title: Optional new title. body_markdown: Optional updated Markdown content. published: Optional publish status (True to publish, False to unpublish/draft). tags: Optional updated list of tags (up to 4). series: Optional series name. canonical_url: Optional canonical URL. description: Optional meta description. main_image: Optional cover image URL.
Returns: Confirmation of update with link to the article.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| title | No | ||
| series | No | ||
| published | No | ||
| article_id | Yes | ||
| main_image | No | ||
| description | No | ||
| body_markdown | No | ||
| canonical_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the DEVTO_API_KEY requirement, the fact that published=False unpublishes/drafts the article, and that it returns a confirmation with a link. However, it does not cover error behavior, permission requirements, or whether omitted fields are left unchanged or overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description leads with the purpose and auth requirement, then presents a clean, scannable Args list covering every parameter, and ends with a brief Returns note. No sentence is wasted, and the structured format makes the content easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers all parameter semantics, authentication, and the return shape, and an output schema exists. The main gap is the absence of guidance on ownership restrictions and whether the article must belong to the authenticated user, which is relevant for an update operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides meaningful semantics for all 9 parameters, including the article_id requirement, the optional nature of each field, the 'up to 4' constraint on tags, and the meaning of published flags. This goes well beyond the bare schema types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update an existing article or draft on DEV.to.' It explicitly targets existing articles, which distinguishes it from the sibling devto_create_article, and the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for updating existing articles or drafts, and 'existing' subtly excludes creation via devto_create_article. However, it never explicitly states when to use this tool versus alternatives, or when not to use it, leaving the routing partially to inference.
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.
12 tool updates
v0.1.0- First observed
devto_create_article - First observed
devto_get_article - First observed
devto_get_comment - First observed
devto_get_comments - First observed
devto_get_latest_articles - First observed
devto_get_me - First observed
devto_get_my_articles - First observed
devto_get_tags - First observed
devto_get_user_profile - First observed
devto_list_articles - First observed
devto_search_articles - First observed
devto_update_article
TDQS
Scored across 12 tools
Tools are mostly distinct: search vs list vs latest all return articles but with different filter mechanisms (keyword vs filters vs chronological), and descriptions clarify the differences. There is some potential confusion between devto_search_articles and devto_list_articles, but they serve different query types.
All tools follow the consistent pattern devto_<verb>_<noun> (e.g., devto_get_article, devto_create_article, devto_search_articles). The verbs are consistent and readable, with no mixed conventions.
12 tools is well within the ideal range and each tool serves a distinct purpose for a DEV.to API clientβcovering search, listing, retrieval, comments, user profiles, tags, and article creation/updating. No redundant or unnecessary tools.
Core workflows are covered: reading articles, searching, listing, fetching comments, viewing profiles, and creating/updating articles. The main gap is the absence of a delete article tool, and no ability to post comments, but these are minor for typical use cases.
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yoβ¦
FastMCP server for posting formatted content to X (Twitter) β Tollbooth-monetized, DPYC-native
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server implementation that allows AI assistants to access, search, and interact with Dev.to content, including fetching articles, retrieving user information, and publishing new content.1062MIT
- AlicenseNot gradedqualityDmaintenanceThis is a complete MCP (Model Context Protocol) server that implements a articles of dev.to with robust validation using TypeScript and Zod. The server integrates directly with Cursor, allowing you search articles on dev.to.7 npmMIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server implementation built with Python and FastAPI for educational purposes. Demonstrates MCP server functionality through a books API interface.MIT
- AlicenseAqualityCmaintenanceA production-ready MCP server for the DEV Community (Forem) API, enabling management of articles, comments, users, tags, organizations, reading list, and followers through any MCP-compatible client.1619 npm5MIT