Facebook MCP
This server lets AI agents manage Facebook Pages through Meta's official Graph API: reading insights, posting, scheduling, and moderating comments.
Page management: list connected Pages, view Page details like followers and category
Posting: publish text posts or photo posts, optionally with links or captions
Scheduling and drafts: save drafts, schedule posts 10 minutes to 6 months ahead, publish drafts immediately
Post management: list published posts with engagement counts, list scheduled/draft posts, edit post text, delete posts
Comment moderation: read comments with authors and timestamps, reply as the Page, hide/unhide comments, delete comments
Insights: get Page-level metrics (impressions, reach, engagement, follower change) and post-level metrics (impressions, reach, clicks, reactions)
Multi-Page support: act across all Pages you administer, with a preferred-Page ordering for unnamed actions
Safety controls: writing requires an opt-in environment variable, deletion requires another, and writes can be audit-logged
Provides tools for managing Facebook Pages, including creating and scheduling posts, saving drafts, viewing Page and post insights, and moderating comments.
Click on "Install 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., "@Facebook MCPhow did last week's posts do, and schedule the follow-up for Tuesday 9am"
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.
Facebook MCP
Facebook MCP server for Claude Code and AI agents. Posting, scheduling, drafts, Page and post insights, and comment moderation.
Setup needs a Meta developer app. There is no way around that: Facebook only issues Page tokens through an app you own. You create one once, generate a user token, and login exchanges it for Page tokens that never expire.
Pages only. Facebook removed personal profile posting from the API in 2018 and never replaced it, so no tool can do it, including this one.
Scheduling is real. Facebook holds the post and publishes it itself, so nothing has to be running on your machine at the time.
15 tools, across as many Pages as you administer.
You: how did last week's posts do, and schedule the follow-up for Tuesday 9am
Claude: Reading your Page insights.
3 posts, 14,200 impressions, 380 engagements
The Thursday one did 4x the others
Scheduled the follow-up for Tuesday 09:00.Contents
Section | ||
1 | Real prompts, not features | |
2 | One command | |
3 | The setup step there is no way around | |
4 | And make it permanent | |
5 | Every client, copy and paste | |
6 | One command that says what is broken | |
7 | All fifteen | |
8 | Three levels, three switches | |
9 | Picking which one acts | |
10 | What Facebook will not let you do | |
11 | When something breaks | |
12 | Common questions |
Related MCP server: PagePilot MCP
1. What you can ask it 💬
Schedule this for Tuesday at 9am, and draft two alternatives I can pick from.
Which post this month got the most reach, and what was different about it?
Compare last week to the week before. Did the change in posting time help?
Read the comments on the last five posts and tell me what people keep asking.
Draft a reply to each comment that deserves one, in my voice. Do not post them.
Hide the spam on that post, but leave the criticism.
How many followers did I gain this month, and which day did most of it happen?
What this adds over Meta Business Suite, which already schedules posts:
Business Suite shows you numbers. It cannot answer a question about them. "Why did Thursday do four times better" needs someone to look at the posts, compare them, and form a view. That is the part a conversation does and a dashboard does not.
The second thing is that reading and acting happen in one place. You ask what worked, decide what to do about it, and schedule the follow-up without opening another tab or copying anything between windows.
What to do first, in order:
Install it, one command, section 2
Create a Meta app and connect your Page, sections 3 and 4. This is the part that takes ten minutes, and only once
Point your client at it, section 5
Ask it something read-only, like "how did my last five posts do"
Turn on writing only once you trust what it is telling you
Reading works as soon as a Page is connected. Posting stays off until you set one environment variable, deliberately.
2. Quick install ⚡
npx -y @thenavidm/facebook-mcp --versionNode 20 or newer. Nothing else to install.
That gets you the server. Connecting a Page is the next three sections, and it is the part that takes real time.
3. Create your Meta app 🔑
Facebook has no app passwords and no personal tokens. Every credential comes through an app you own, so you make one once.
You do not need App Review, and you do not need Business Verification. Those are only for managing Pages belonging to other people, which Meta calls Advanced Access. For your own Pages, Standard Access is enough and it is granted the moment you ask.
One app covers Facebook, Instagram and Threads.
Use cases are ticked in a list, and you can tick several. If you plan to use more than one of these, do it now rather than making three apps and managing three sets of credentials.
Use case | For | Server |
Manage everything on your Page | Facebook Pages | this one |
Manage messaging and content on Instagram | ||
Access Threads API | Threads |
Incompatible combinations grey out. If an option will not tick, it conflicts with something already selected.
Step 1: the creation wizard
developers.facebook.com/apps/creation. Five screens, in this order.
App details. A name, up to 30 characters, and a contact email. The name is only shown on your own My Apps page and can be changed later.
Use cases. This is where people get stuck. The screen opens on Featured (6), and the Pages use case is not one of the six. Change the filter on the left to All (20) or Content management (5) to find it.
The featured six are Marketing API, app ads, Threads, Instant Games, Facebook Login and WhatsApp. None of those is what you want.
Business. Which business portfolio the app belongs to. An unverified one is fine, and "I don't want to connect a business portfolio yet" is a valid answer you can revisit. Verification is only needed to reach other people's data.
Requirements. For a Pages app on your own Pages this reads "No requirements identified". That is the screen confirming you do not need App Review.
Overview. Review and Create app.
Step 2: add the permissions by hand
Creating the app does not give you the permissions. This is the step every
guide skips, and without it login will fail.
Open your app, click the use case in the left sidebar, then Permissions and features. You get a table of every permission that use case can grant, and almost all of them start unadded, showing a dash in the Status column.
Click + Add on each of these:
Permission | What it is for |
| Seeing which Pages you administer. Without it, login finds nothing |
| Reading posts, comments, followers and Page metadata |
| Creating, editing and deleting posts |
| Replying to, hiding and deleting comments |
| Impressions, reach and engagement numbers |
Added permissions move to Ready for testing, which is the state you want. That is Standard Access, it is immediate, and nothing is reviewed.
Those five are what this server needs. The Pages API exposes far more, covering
messaging, leads, monetization and ads, grouped by Meta into tasks like
CREATE_CONTENT, MODERATE, ANALYZE and MESSAGING. Add more only if you
have a reason, since each one widens what an agent holding the token can do.
There is also Add more to this use case in the sidebar, which widens what the use case can grant if something you need is not in the list.
The one people miss ispages_read_engagement. It reads like a write
permission and is not. Leave it out and reading breaks while posting still
works, which is a confusing way to fail.
Step 3: make sure you have an app role
Standard Access only works for people who hold a role on the app. As its creator you are automatically an admin, so this is usually already true and worth knowing rather than doing.
It matters when it is not you. Anyone else who wants to use your app, a colleague or a second account of your own, has to be added under App roles, then Roles, as an Administrator, Developer or Tester. Without a role they cannot grant the permissions at all, and Meta's error does not say why.
Test users live in the same place. They are throwaway accounts Meta generates for you, useful for trying a destructive tool without pointing it at a real Page. They cannot administer a real Page, so they are for testing the plumbing, not the content.
Business Verification is a separate thing again, and you do not need it here. It is required for Advanced Access, which is what you would need to manage Pages belonging to people who have no role on your app. For your own Pages, Standard Access is enough.
Step 4: check the Page is in the same portfolio
Your Page must belong to the business portfolio you attached to the app, or the
app cannot see it and login reports no Pages.
Business settings, then Accounts, then Pages. If it is not listed, add it there first.
Rather have an agent do it
The steps above are written to be handed over. Paste this into Claude, or any agent with a browser:
Walk me through creating a Meta developer app for the Facebook Pages API. I need the "Manage everything on your Page" use case, Standard Access for pages_show_list, pages_read_engagement, pages_manage_posts, pages_manage_engagement and read_insights, and my Page linked to the same business portfolio. Tell me what to click, one step at a time, and wait for me to confirm each one.
4. Get your token 🔑
Generate one
Pick your app, top right
Under Permissions, add the five above
Generate Access Token, and approve
That token dies in about an hour. It does not matter, it is used once.
Exchange it for Page tokens
npx @thenavidm/facebook-mcp login <that token>Writes ~/.facebook-mcp/pages.json, mode 600, one token per Page you
administer.
Make them permanent
Left alone, those Page tokens expire with the user token they came from. That is the single most common reason this stops working the next day.
export FACEBOOK_APP_ID=...
export FACEBOOK_APP_SECRET=...
npx @thenavidm/facebook-mcp login <that token>Both are under Settings, then Basic in your app. With them, login extends the user token first, and the Page tokens it derives never expire.
One app also covers Instagram and Threads
The same Meta app can carry the Instagram and Threads permissions. If you plan to use those too, add their products now rather than making three apps.
5. Connect your client 🔌
Claude Code
claude mcp add --transport stdio facebook -- npx -y @thenavidm/facebook-mcpWith posting allowed:
claude mcp add --transport stdio --env FACEBOOK_ALLOW_WRITE=true facebook -- npx -y @thenavidm/facebook-mcpClaude Desktop
Platform | Path |
macOS |
|
Windows |
|
{
"mcpServers": {
"facebook": {
"command": "npx",
"args": ["-y", "@thenavidm/facebook-mcp"],
"env": { "FACEBOOK_ALLOW_WRITE": "true" }
}
}
}Quit Claude Desktop completely and reopen it.
Cursor
~/.cursor/mcp.json for every project, or .cursor/mcp.json inside one. Same
shape as Claude Desktop.
VS Code with GitHub Copilot
.vscode/mcp.json. Note it uses servers, not mcpServers.
{
"servers": {
"facebook": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@thenavidm/facebook-mcp"]
}
}
}Windsurf, Zed, Cline, Codex CLI, Gemini CLI
All take the same stdio shape. Codex uses TOML:
[mcp_servers.facebook]
command = "npx"
args = ["-y", "@thenavidm/facebook-mcp"]Docker
docker build -t facebook-mcp .
docker run -i --rm -v facebook-mcp:/home/node/.facebook-mcp facebook-mcpThe volume matters. Page tokens live in the home directory, and without it every login is written into a container that is about to disappear.
6. Check it worked 🩺
npx @thenavidm/facebook-mcp doctorIt names every Page it can reach, with follower counts. If something is wrong it says which link in the chain broke, because Meta's own error rarely does.
7. Tools 🧰
Fifteen. Each declares whether it reads or writes, so your client can show you before anything runs.
Your Pages
Tool | ||
| read | Every Page this server can act as |
| read | Name, category, followers, about, website |
Posting
Tool | ||
| write | Text post, optionally with a link |
| write | Photo from a URL, with a caption |
| write | Push a draft or scheduled post out now |
| write | Edit the text of a published post |
| delete | Cannot be undone |
| read | Published posts with reaction, comment and share counts |
| read | Scheduled and draft posts not yet out |
Comments
Tool | ||
| read | With author and time |
| write | Public reply, as the Page |
| write | Hide or unhide. Reversible |
| delete | Cannot be undone |
Numbers
Tool | ||
| read | Impressions, reach, engagement, follower change |
| read | How one post did |
Scheduling and drafts
create_post covers three cases with one tool:
Intent | Arguments |
Post now |
|
Save a draft |
|
Schedule |
|
Facebook requires 10 minutes to 6 months ahead. Its own error for breaking that says nothing useful, so this checks first and tells you which rule you hit.
8. Posting safely 🔒
A Page post is public the moment it lands. Deleting one cannot be undone. Two different risks, so two different switches.
Reading needs nothing.
Writing needs FACEBOOK_ALLOW_WRITE=true. Posting, editing, replying and
hiding all refuse without it, so a default install cannot publish anything.
Deleting needs FACEBOOK_ALLOW_DELETE=true as well.
Every write can be logged. Set FACEBOOK_AUDIT_LOG=/path/to/file and every
attempt is appended, with no tool able to read or edit it.
Comment text is labelled as data rather than instructions when handed to the model. Comments are written by strangers, and an agent that reads them and can also post is exposed to whatever they put there.
9. Several Pages 📄
list_pages shows them, and every tool takes a page argument to name one.
Unnamed, it uses the first, which is rarely what you want. Set an order:
export FACEBOOK_PREFERRED_PAGES="Navid Media,Side Project"Exact name matches beat prefix matches, so a Page called "Navid Media" will not swallow a request meant for "Navid".
10. Limits worth knowing ⚠️
Pages only. Facebook removed personal profile posting from the API in 2018 and never replaced it. No tool can do it.
Insights lag by a few hours, so this morning's post looks quieter than it is.
Rate limits are per app, not per Page. Heavy use across several Pages shares one budget. Reads back off and retry; writes never retry, because retrying a post risks publishing twice.
Edits are visible. Facebook shows viewers an edit history on any post you change.
11. Troubleshooting 🔧
"The Page token is invalid or expired." The token was short-lived. Set
FACEBOOK_APP_ID and FACEBOOK_APP_SECRET and run login again.
"The token is missing a permission." Regenerate with all five permissions.
Missing pages_read_engagement is the usual one, and it breaks reading rather
than writing, which makes it confusing.
"That token can see no Pages." Missing pages_show_list, or you are not an
admin of any Page.
Posting refuses. That is the default. Set FACEBOOK_ALLOW_WRITE=true.
Anything else. Run doctor. It checks each Page and reports the first
broken link.
Full setup walkthrough: references/setup.md.
FAQ ❓
Model Context Protocol is a standard way to give an AI assistant access to a tool or a data source. An MCP server exposes a set of functions, and a client like Claude Code or Claude Desktop calls them during a conversation. This one exposes Facebook Pages.
You install it once, point your client at it, and then ask in plain language. You never call the tools yourself.
Because Facebook has no other way to issue a token. There are no app passwords and no personal access tokens, so every credential is minted by an app someone owns. For a personal tool, that someone is you.
It is free, takes about ten minutes, and only happens once. Nothing is reviewed, nothing is published, and nobody else sees the app.
No. This is Meta's own API used the way Meta intends. The account risk that exists on Instagram's unofficial API, or on WhatsApp's companion protocol, does not apply here.
The real limit is rate limiting, which is per app rather than per Page. Heavy automated use across several Pages shares one budget.
One file, ~/.facebook-mcp/pages.json, written mode 600. It holds your Page
ids and their tokens, nothing else.
No posts, no comments and no insights are stored. Everything is fetched live and passed straight to your client, so there is no local copy of your content.
If you set FACEBOOK_AUDIT_LOG, every attempted write is appended to that file
as well.
No. The Graph API is free for this, the Meta app is free, and there is no paid tier involved. You pay for whatever AI client you use, and nothing else.
npm names are first come, first served, and unscoped ones go quickly. Scoped
packages like @thenavidm/facebook-mcp avoid the scramble and make it obvious
who published it, which matters for something that holds credentials.
Yes. login stores every Page you administer, and each tool takes a page
argument. Set FACEBOOK_PREFERRED_PAGES so an unnamed action lands somewhere
predictable rather than on whichever was stored first.
No, not for your own Pages. App Review and Business Verification are for managing Pages belonging to other people, which Meta calls Advanced Access. For Pages you administer, Standard Access is enough and is granted the moment you request it.
No, and neither can anything else. Facebook removed profile posting from the API in 2018 and never brought it back. Pages are the only writable surface.
No. It is Meta's official Graph API, the same one their own tools use. Nothing is reverse engineered and your account is not at risk.
Page tokens derived from a long-lived user token do not expire at all. Without your app id and secret, login can only produce short-lived ones that die in about an hour, which is the most common reason this stops working.
Yes, natively. Facebook holds the post and publishes it itself, so nothing has to be running on your machine at the time. Real drafts too.
It cannot post at all unless you set FACEBOOK_ALLOW_WRITE=true. With that on
it can, so set FACEBOOK_AUDIT_LOG and every attempt is written to a file no
tool can edit.
Yes. The same app can carry all three sets of permissions, so add those products now if you plan to use them rather than creating three apps.
Yes, both, and it can hide comments, which is reversible and the right answer for spam. Deleting is possible but needs a separate switch.
Questions
Run into a problem or have a question? Open an issue and I will help.
About the author
Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Facebook MCP server is one piece of that system.
Links
Personal website: navid.me
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
License
MIT. Free to use, modify, and share.
Not affiliated with, endorsed by, or connected to Meta Platforms, Inc.
© 2026 NM Media. Made with ❤️ by Navid Moazzez.
Available Tools
15 toolscreate_photo_postPost a photoA
Publish a photo from a public URL, with an optional caption. Same scheduling and draft options as a text post.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Publicly reachable image URL | |
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| draft | No | ||
| caption | No | ||
| publish_at | No | ISO timestamp to schedule for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide openWorldHint=true and destructiveHint=false, so the bar is lower. The description adds meaningful behavioral context: the action is 'Publish' (visibility implications), it accepts public URLs only, and it supports draft/scheduling behavior. This goes beyond the annotation-provided safety profile. It does not cover auth or irreversibility, but that is not a critical gap given the annotations.
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?
Two sentences, front-loaded with the core action and resource, followed by a concise reference to sibling behavior. Every word earns its place; there is no filler or repetition of schema details.
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 create/publish tool with no output schema and no nested objects, the description plus schema and annotations are sufficient to select and invoke the tool correctly. The only minor gap is that the return shape is not described, but that is optional given the tool's simplicity and the absence of an output schema.
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 60%, with 'url' and 'page' and 'publish_at' already described in the schema. The description compensates for undocumented parameters by mentioning 'optional caption' (caption) and 'Same scheduling and draft options as a text post' (draft, publish_at), adding meaning beyond the bare property names.
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 ('Publish'), names the resource ('a photo'), and specifies the source ('from a public URL'). It distinguishes this tool from the sibling 'create_post' by explicitly framing it as a photo post variant and referencing 'a text post' for behavioral comparison.
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 clearly implies this tool is for publishing photo posts, and the phrase 'Same scheduling and draft options as a text post' provides contextual comparison to the text-post sibling. However, it stops short of explicitly stating when to use this tool versus 'create_post' or other alternatives, so the guidance is inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postPost to a PageA
Publish a text post, optionally with a link. Leave publish_at empty and draft false to post immediately. Set draft to keep it unpublished, or publish_at to schedule it.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | A URL to attach, rendered as a preview card | |
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| draft | No | Save unpublished instead of posting | |
| message | Yes | The post text | |
| publish_at | No | ISO timestamp to schedule for. At least 10 minutes out, at most 6 months |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, the description explains the three posting behaviors (immediate, draft, scheduled) and that publishing is the default. It doesn't mention Page-access requirements or external visibility consequences, but the core side effect—creating and publishing a post—is plainly disclosed. No contradiction with annotations.
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?
Three short sentences, front-loaded with the core action, then conditional behavior. No filler or repetition of schema text.
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 5-parameter creation tool with no output schema and all parameters documented, the description covers the relevant decision points. It lacks explicit mention of permissions or response semantics, but those are common to this domain and can be inferred from the resource being created.
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?
With 100% schema coverage the baseline is 3, and the description earns extra credit by explaining the relationship between publish_at and draft ('Leave publish_at empty and draft false to post immediately'). It also clarifies that link is an optional attachment, which aligns with the 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 opens with 'Publish a text post, optionally with a link,' giving a specific verb, resource, and scope. This clearly distinguishes it from the sibling create_photo_post and from update/delete operations.
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?
It gives clear operational guidance for the main modes: leave publish_at empty and draft false for immediate posting, set draft to keep unpublished, or set publish_at to schedule. It does not explicitly call out alternatives like create_photo_post, but the 'text post' phrase implies the boundary, so the guidance is clear though not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_commentDelete a commentADestructive
Permanently delete a comment. Cannot be undone, and refused unless deletion is explicitly enabled. Hiding is usually the better answer.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| comment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though destructiveHint already flags danger, the description adds irreversibility ('Cannot be undone'), an access/configuration condition, and a strong recommendation toward hiding. This is decision-relevant context beyond the annotation.
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?
Three short sentences, each carrying distinct value: the operation, the permanence/prerequisite, and the preferred alternative. There is no filler, repetition, or vague phrasing.
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 two-parameter destructive tool, the description covers irreversibility, gating conditions, and a safer alternative, which is largely sufficient. The main remaining gap is the under-documented comment_id, though the parameter name makes its role broadly inferable.
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 schema documents 'page' but leaves 'comment_id' with only a type and no description. The tool description does not explain where to find the comment ID, its format, or any additional semantics, so it fails to compensate for the 50% schema coverage gap.
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 and target: 'Permanently delete a comment.' The word 'permanently' adds meaningful scope, and the closing guidance about hiding distinguishes this tool from the sibling hide_comment.
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?
It gives a clear prerequisite ('refused unless deletion is explicitly enabled') and recommends the safer alternative ('Hiding is usually the better answer'). It does not explicitly name hide_comment or spell out when deletion is appropriate, leaving a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_postDelete a postADestructive
Permanently delete a post. This cannot be undone, and is refused unless deletion is explicitly enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true, and the description adds useful behavioral detail: deletion is permanent, cannot be undone, and requires explicit enablement. This goes beyond the structured annotation data and is consistent with it.
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?
Two short sentences communicate the core action, permanence, and refusal condition with no filler. The most critical 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 two-parameter destructive tool with no output schema, the description covers the operation's nature, consequences, and preconditions. The page parameter is documented in the schema, and post_id is straightforward. 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?
Schema description coverage is 50%: page is described, post_id is not. The description does not explain either parameter, but post_id is self-evident and page is already documented in the schema. This is adequate but adds no extra semantic value.
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 and resource: 'Permanently delete a post.' This clearly distinguishes it from sibling tools like delete_comment, hide_comment, and update_post without ambiguity.
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 a clear precondition: deletion is refused unless explicitly enabled. It does not explicitly name alternatives, but the post-specific target is clear from the name and description, giving adequate context for when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageGet Page detailsARead-only
Profile details for a Page: name, category, follower count, about text, website and whether it is published.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, and the description is consistent with a read-only operation, so there is no contradiction. The description adds useful detail about the returned fields but does not discuss authentication, rate limits, or default-page behavior; with read-only annotations, this is adequate but not rich.
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 a single, front-loaded sentence that succinctly lists the key output fields without filler. It is appropriately sized for a simple tool and every word contributes value.
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 low-complexity, one-parameter, read-only tool with no output schema, the description is sufficiently complete: it enumerates the returned profile fields, and the schema covers parameter semantics. Nothing essential is missing for an agent to select and invoke the tool 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?
The schema fully documents the single optional page parameter, including how to specify it by name or id and that omitting it uses the default. Since schema description coverage is 100%, the tool description adds no additional parameter-level meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (a Page) and the operation (retrieve profile details), and lists specific fields so an agent knows what information is returned. It does not explicitly distinguish itself from sibling tools like list_pages or get_page_insights, though 'profile details' strongly implies a single-page read.
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 conveys an implied use case: retrieve profile details for a specific Page. However, it offers no explicit when-to-use or when-not-to-use guidance and does not mention alternatives such as list_pages for enumeration or get_page_insights for analytics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_insightsPage performanceARead-only
How the Page itself is doing over a date range: impressions, reach, engaged users and follower change.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| since | No | ISO date, defaults to 28 days ago | |
| until | No | ISO date, defaults to today |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile; the description adds that results include impressions, reach, engaged users, and follower change over a date range. It does not disclose pagination or aggregation details, so it adds only moderate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys resource, scope, and key result fields with no filler. Every word earns its place.
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 read-only, zero-required-parameter tool, the schema plus annotations cover the inputs and safety profile, while the description covers the result categories. No output schema exists, but the listed metrics give the agent enough expectation of the return value.
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 100%, so parameters (page, since, until) already carry their meaning. The description does not add parameter-format or default-value details beyond the schema, justifying the baseline 3.
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/resource relationship ('How the Page itself is doing over a date range') and enumerates concrete metrics, distinguishing it from sibling get_post_insights by emphasizing Page-level scope.
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 phrase 'the Page itself' and the date-range framing give clear context for when to query page-level performance. It does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_insightsPost performanceARead-only
How one post did: impressions, reach, clicks and reactions. Post metrics are named differently from Page metrics, which is why this is a separate tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, so the description does not need to restate that. It adds useful context about the returned metrics and the naming distinction, but it does not disclose behaviors such as time range handling, data availability limits, or whether the response is paginated.
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 two sentences with no filler: the first sentence front-loads the tool's core function and return metrics, and the second justifies the separation from page-level analytics. Every word earns its place.
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 insights tool with one required parameter, the description, schema, and annotations cover most of what an agent needs to call it correctly. The only notable gap is the undocumented post_id semantics and the absence of any return-shape details, but the tool's low complexity keeps this from being a serious deficiency.
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 schema only documents the 'page' parameter; 'post_id' has no description, leaving 50% of the parameters undocumented. The description says 'one post' but does not clarify how to identify the post with post_id or how the optional page parameter affects the call, so it does not compensate for the schema coverage gap.
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 'How one post did' and enumerates the exact metrics returned (impressions, reach, clicks, reactions), making the target resource unmistakable. It also explicitly contrasts Post metrics with Page metrics, distinguishing this tool from the sibling get_page_insights without needing to inspect schemas.
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 explains that Post metrics are named differently from Page metrics and that is why this is a separate tool, giving an implicit directive to use it for post-level rather than page-level analytics. It does not explicitly name the alternative tool or state a direct 'use this when' rule, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hide_commentHide or unhide a commentA
Hide a comment from everyone except its author and their friends. Reversible, and the usual answer for spam or abuse. Prefer this to deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| hidden | No | True to hide, false to unhide. Default true | |
| comment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate non-destructive behavior with destructiveHint=false, and the description adds valuable behavioral details: the action is reversible, and the hidden state still allows visibility to the author and their friends. It goes beyond what annotations alone convey, though it omits details like permission requirements.
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, front-loaded with the core behavior, and follows with rationale and a preference comparison. Every sentence serves a purpose without redundancy or 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 simple three-parameter tool with clear schema descriptions and non-destructive annotations, the description provides the essential context: what the action does, who still sees the comment, that it is reversible, and how it relates to the delete alternative. No critical information is missing for an agent to invoke it 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 67%, with page and hidden already described in the schema. The description does not add significant parameter-level detail beyond what the schema provides, though the reversibility wording ties into the hidden boolean. This meets the baseline for schema-covered parameters.
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 action (hide or unhide) and the resource (a comment), and specifies the exact visibility effect: hidden from everyone except the author and their friends. It also distinguishes itself from the sibling delete_comment by explicitly saying 'Prefer this to deleting.'
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 explicit guidance on when to use this tool: it is 'the usual answer for spam or abuse' and should be preferred over deleting. This provides a clear decision rule compared to delete_comment, the main alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsRead commentsARead-only
Comments on a post, with who wrote each one and when. Use this before replying or moderating.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| limit | No | Default 50 | |
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates that this is a safe, non-mutating operation, so the bar for additional disclosure is lower. The description adds the useful detail that results include author and timestamp, but it does not disclose pagination behavior, ordering, or the effect of the limit parameter.
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 two short sentences with no filler. It front-loads the core purpose and follows with a concise usage cue, so every sentence earns its place.
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 tool with a readOnlyHint annotation and a schema that documents most parameters, the description covers the essential return contents and use case. It does not describe pagination or output shape beyond author and timestamp, but those are minor gaps given the tool's simplicity.
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?
Input schema coverage is 67%, with post_id lacking a schema description. The description only indirectly references post_id via 'on a post' and adds no meaning for page or limit beyond what the schema already states. With partial schema coverage, the description should compensate more than it does.
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 title 'Read comments' and description 'Comments on a post, with who wrote each one and when' clearly identify the resource and the read action. It also distinguishes itself from sibling write tools like reply_to_comment, hide_comment, and delete_comment by framing it as the precursor to replying or moderating.
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 phrase 'Use this before replying or moderating' gives explicit context for when to call this tool. It does not name specific alternatives or exclusions, but the intended use case is clear enough for an agent to select it over the mutating comment tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesList connected PagesARead-only
List every Facebook Page this server can act as, with its id and name. Call this first when you have more than one, so you can name the right Page on later calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds useful behavioral context beyond that: the tool lists pages the server can act on and returns id and name. It also frames the call as a prerequisite for later page-scoped operations, which helps the agent reason about workflow. No contradiction with annotations.
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?
Two short sentences, each earning its place: the first says exactly what the tool returns, and the second gives actionable usage guidance. 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, parameterless listing tool, the description is complete. It names the output fields, clarifies permission scope, and explains when to call it. No output schema exists, but the description covers the essential return information.
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 and schema coverage is 100%, so there is nothing for the description to add about parameter meanings. The baseline of 4 for a parameterless tool applies.
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 ('List') and a clear resource ('every Facebook Page this server can act as'), and explicitly mentions the returned fields (id and name). This distinguishes it from page-scoped tools like get_page and content listers like list_posts or list_comments.
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?
It provides explicit timing guidance: 'Call this first when you have more than one, so you can name the right Page on later calls.' This tells the agent when to invoke it and why, though it does not explicitly contrast with get_page for cases where the page id is already known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsList postsARead-only
Published posts on a Page, newest first, with their reaction, comment and share counts.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| limit | No | Default 25, maximum 100 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description builds on this by disclosing ordering and that reaction, comment, and share counts are included. This adds useful behavioral context without contradiction.
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?
A single compact sentence delivers the core resource, scope, ordering, and return highlights. Every word earns its place 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 low-complexity, read-only listing tool with no required parameters, the description sufficiently covers what is returned and in what order. Pagination behavior is partially captured by the limit parameter, so nothing critical is missing.
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 100%, with both page and limit already explained. The description adds no additional parameter-level meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (list), resource (posts on a Page), scope (published only), and ordering (newest first). This differentiates it from siblings like list_scheduled_posts and create_post without needing to open schemas.
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 clearly implies this tool is for retrieving published post data, not for creating or modifying content. It does not explicitly name alternatives or exclusions, but the 'Published posts' context gives clear situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_postsList scheduled and draft postsBRead-only
Posts that have not gone out yet: both scheduled ones and saved drafts, with the time each is due.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds useful scope context (scheduled + drafts, due time per item). It does not disclose ordering, pagination, or how drafts without a scheduled time are treated.
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?
One efficient sentence that front-loads the key distinction ('not gone out yet') and adds due-time information beyond the title. No filler or redundancy.
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?
Adequate for a simple read-only list tool with one optional parameter, and the due-time mention partially compensates for the missing output schema. Ordering, pagination, and field details are left unspecified.
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 100%: the single optional page parameter is fully documented with name-or-id semantics and default behavior. The description adds no parameter detail, which is fine at this coverage level.
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 the resource and a crisp inclusion criterion — posts that have not gone out yet, covering both scheduled posts and saved drafts, with their due times. This scope clearly separates it from list_posts, though it doesn't name the sibling explicitly.
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?
Usage context is only implied: an agent can infer this tool is for viewing pending or unpublished content, but the description never says when to prefer it over list_posts or how it relates to publish_draft. No alternatives or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_draftPublish a draft nowA
Take a draft or scheduled post and publish it immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| post_id | Yes | From list_scheduled_posts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal openWorldHint=true and destructiveHint=false. The description adds that the tool acts on drafts or scheduled posts and publishes immediately, but it does not disclose whether the draft/scheduled entry is consumed or that the post becomes publicly visible. This is adequate but not detailed.
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 a single, tightly worded sentence that conveys the action, target, and immediacy without any filler or repetition. Every word earns its place.
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 tool with annotations and a fully descriptive schema, this description covers the core purpose and timing. It does not explain return values or post-publication state, but those are not essential for selecting and invoking the tool 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 coverage is 100%, with the schema already describing post_id as 'From list_scheduled_posts' and page as the page name/id with a default. The description adds no additional parameter-level meaning, so the baseline of 3 applies.
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 ('publish') and target resource ('draft or scheduled post') with the key nuance 'immediately.' It is clear and distinguishable from sibling tools like update_post or create_post, though it does not explicitly name a sibling to differentiate from.
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: when you have a draft or scheduled post and want it published immediately. However, it does not explicitly state when not to use it or mention alternatives such as update_post for editing before publication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_commentReply to a commentA
Post a public reply under a comment, as the Page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| message | Yes | ||
| comment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint=false and openWorldHint=true, so the description's job is lighter. It adds behavioral context by specifying the reply is 'public' and posted 'as the Page', but it does not disclose potential side effects, permission requirements, or whether the action can be undone. No contradiction with annotations exists.
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 a single, front-loaded sentence with zero filler. Every word earns its place: the action, object, visibility, and actor are all conveyed efficiently.
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 three-parameter action tool, the description sufficiently covers what the tool does and who it acts as. It does not describe return values (no output schema) or constraints like comment_id format, but those are minor gaps for this straightforward 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 only 33% (only 'page' has a description). The main description hints at the roles of comment_id and message ('reply under a comment') and page ('as the Page'), but it does not provide format, constraints, or default behavior beyond the schema. It partially compensates for low schema coverage but does not fully clarify parameter semantics.
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 ('Post'), a precise resource ('a public reply under a comment'), and the acting identity ('as the Page'). This clearly separates it from sibling tools like hide_comment, delete_comment, and create_post without needing to inspect schemas.
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 action is inherently clear, but the description never states when to choose this tool over alternatives such as hide_comment or delete_comment. It also gives no context about prerequisites or edge cases, so usage is only implied by the tool's name and phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_postEdit a postA
Change the text of a published post. Facebook shows an edit history to viewers.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Which Page to act as, by name or id. Omit to use the default. | |
| message | Yes | The replacement text | |
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a meaningful side effect beyond the annotations: 'Facebook shows an edit history to viewers.' This tells the agent that edits are permanent in the public record, which complements the non-destructive and open-world annotations. It does not mention auth or rate limits, but it does disclose a key behavioral consequence.
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?
Two short, front-loaded sentences with no filler. The core action is stated first, and the edit-history note earns its place as essential behavioral context.
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 description is adequate for understanding the basic update operation, and the edit-history note adds context. However, it omits what the tool returns, any permissions required to edit a Page post, and whether only text is editable or other fields are affected. For a mutation tool with no output schema, this is a noticeable gap.
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 adds no parameter-specific meaning beyond what the input schema already provides. The schema covers message and page, but post_id has no description and the tool description does not fill that gap or clarify constraints, defaults, or formats.
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 names the exact action and resource: 'Change the text of a published post.' This distinguishes update_post from siblings like create_post, delete_post, and publish_draft, and makes the tool's unique role clear.
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 given about when to use this tool versus alternatives, nor are exclusions or prerequisites stated. Usage is implied by the verb 'Change,' but the description does not actively route the agent away from create_post or publish_draft when appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource/action combination: pages, posts, scheduled posts, comments, and insights are cleanly separated. Paired tools like create_post/create_photo_post and hide_comment/delete_comment are clearly differentiated by type and behavior.
All tools use consistent snake_case verb_noun conventions such as list_*, get_*, create_*, delete_*, update_*, and publish_*, making the action and object predictable. Minor variations like reply_to_comment are still clearly understandable.
15 tools sit at the upper end of the ideal range, but each maps to a meaningful Facebook Pages operation. The count covers page management, post lifecycle, comments, and insights without redundant utilities.
The set covers the main Page post lifecycle (create, schedule, list, update, delete) plus comments and insights. Minor gaps exist, such as no top-level comment-on-post tool and no way to reverse a hidden comment, but core workflows remain workable.
Maintenance
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
Instagram for AI agents: publish, read comments and DMs, insights, and engage from your account.
60+ Meta Ads tools for AI agents: audits, campaign management, audiences and CAPI tracking.
Draft, schedule and publish social posts to nine platforms from any AI agent.
Schedule and publish social media posts to 9 platforms from your AI agent
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage Facebook profiles, pages, posts, and engagement via the Graph API with OAuth authentication.2
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage a Facebook Fanpage via the official Graph API, supporting posting, scheduling, comment moderation, and analytics, without scraping or accessing private messages.MIT
- AlicenseNot gradedqualityCmaintenanceAutomates Facebook Page management via Graph API, enabling posting, comment moderation, and analytics through AI agents.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to automate Facebook Page management including posting, commenting, and analytics via the Facebook Graph API.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/navidmoazzez/facebook-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server