facebook-mcp
An open-source Model Context Protocol server that lets AI assistants manage your Facebook Pages: publish and schedule posts, moderate comments, and read analytics. It's built on FastMCP and works with Claude Desktop, Claude Code, ChatGPT, Gemini CLI, Cursor, VS Code and any other MCP client.
"Schedule tomorrow's 9am post on Acme Coffee announcing the new menu, then hide any spam comments on yesterday's post."
Features
- Multi-page: give it one user token and it finds every Page you manage. Each Page uses its own Page token automatically.
- 16 tools covering posts, scheduling, photos, Reels, comments, moderation and insights.
- Safe by default: tools are labelled read-only or destructive (MCP
annotations), a
--read-onlymode hides write tools, requests are signed withappsecret_proof, and tokens never appear in URLs or logs. - Runs anywhere: stdio for desktop clients, streamable HTTP (with optional bearer auth) for remote clients, or the Docker image.
- Production-quality code: typed (
mypy --strict), layered architecture, and over 95% test coverage against a mocked Graph API.
Quick start
1. Get a token. Create a Meta app and generate an access token with the Page permissions listed in docs/setup-meta-app.md. This takes about 5 minutes.
2. Add the server to your MCP client. You'll need uv.
For example, in Claude Desktop's claude_desktop_config.json:
{
"mcpServers": {
"facebook": {
"command": "uvx",
"args": ["facebook-mcp"],
"env": {
"FB_USER_ACCESS_TOKEN": "your-long-lived-user-token",
"FB_APP_SECRET": "your-app-secret"
}
}
}
}
Config for every other client (Claude Code, ChatGPT, Gemini CLI, Cursor, VS Code, Docker) is in docs/clients.md.
3. Ask your assistant something like "Which Facebook Pages can you manage?"
Tools
Every tool except list_pages accepts an optional page (a Page id or exact
name). Leave it out and the server uses the default Page. For post ids, it uses
the Page that owns the post.
| Tool | Type | Description |
|---|---|---|
list_pages |
read | Pages this server can manage |
get_page_info |
read | Name, category, about, link, fans and followers |
list_posts |
read | Published posts with reaction, comment and share counts (paginated) |
list_scheduled_posts |
read | Scheduled, not-yet-published posts |
get_post |
read | One post with engagement counts |
create_post |
write | Publish or schedule a text/link post |
create_photo_post |
write | Publish a photo from a public URL |
create_reel |
write | Upload a local video and publish or schedule it as a Reel |
update_post |
write | Edit a post's text |
delete_post |
destructive | Delete a post |
list_comments |
read | Comments on a post, or replies to a comment (paginated) |
add_comment |
write | Comment as the Page, or reply to a comment |
set_comment_hidden |
write | Hide or unhide a comment |
delete_comment |
destructive | Delete a comment |
get_page_insights |
read | Page analytics over a period or date range |
get_post_insights |
read | Analytics for one post |
Configuration
Settings come from environment variables, or from a .env file in the working
directory (see .env.example).
| Variable | Default | Description |
|---|---|---|
FB_USER_ACCESS_TOKEN |
Multi-page mode. A long-lived user token; every Page you manage is discovered. | |
FB_PAGE_ID + FB_PAGE_ACCESS_TOKEN |
Single-page mode. Use instead of the user token. | |
FB_DEFAULT_PAGE |
Page id or name to use when a tool call doesn't name one | |
FB_APP_SECRET |
Your app secret. Turns on appsecret_proof signing (recommended). |
|
FB_GRAPH_API_VERSION |
v26.0 |
Graph API version |
FB_TIMEOUT |
30 |
Graph request timeout, in seconds |
MCP_TRANSPORT |
stdio |
stdio or http |
MCP_HOST / MCP_PORT / MCP_PATH |
127.0.0.1 / 8000 / /mcp |
HTTP transport only |
MCP_AUTH_TOKEN |
HTTP only: require Authorization: Bearer <token> |
|
MCP_READ_ONLY |
false |
Hide every write tool |
MCP_LOG_LEVEL |
INFO |
Log level (logs go to stderr) |
CLI flags override environment variables:
facebook-mcp --transport http --port 8000 --read-only
facebook-mcp exchange-token --app-id 123 --token SHORT_LIVED_TOKEN # reads FB_APP_SECRET
Security
- Use
--read-onlyuntil you trust your setup. - Always set
MCP_AUTH_TOKENwhen serving over HTTP, and never expose an unauthenticated server to the internet. - Turn on Require App Secret in your Meta app's advanced settings, so a leaked token can't be used without your app secret.
- Never commit tokens.
.envis git-ignored.
To report a vulnerability, see SECURITY.md.
Documentation
Contributing
Contributions are welcome. See CONTRIBUTING.md for the dev
setup and guidelines. In short: uv sync, then uv run pytest.
License
MIT © Salinda Hulangamuwa
This is an independent project. It is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. Facebook is a trademark of Meta Platforms, Inc.
Metadata
Release files for facebook-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| facebook_mcp-0.2.0.tar.gz | 26.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| facebook_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.4 kB
Release files / facebook_mcp-0.2.0.tar.gz
| Download URL | facebook_mcp-0.2.0.tar.gz |
|---|---|
| Size | 26.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
539d4192fd7d8b681e39b65f3858a7d54ea3b26f3620f3faf92ca87897316dc3
|
|
BLAKE2b-256 checksum How to use checksums |
b0f87435226722c3e5eae8e24c98d748855aeb88821decf896cbd7da4a6e570e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / facebook_mcp-0.2.0-py3-none-any.whl
| Download URL | facebook_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 32.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f08c34697f35b0ae8ae85bc7502f36082293570d430f7ef8ed10007b053811de
|
|
BLAKE2b-256 checksum How to use checksums |
f1ae96af87ce7db31c2b4339fb24f8068c4bf781c9c39cab6b8b454e7e3d8e5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|