Facebook MCP Server
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 MCP ServerGet the like count and latest posts from the @Starbucks Facebook page"
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 Server
A hosted Model Context Protocol (MCP) server that gives Claude, Cursor, Windsurf and any other MCP client one read-only Facebook tool. Look up a public page or profile by its handle and get the page record with its exact like count, contact details and owner, plus the post feed with reactions, comments and shares, all as structured JSON, with no Meta developer app and nothing to host.
It reads public Facebook pages that a signed-out visitor can see. Groups and private personal accounts are out of scope.
1,000 free credits every month, no card required, which is 100 Facebook calls at the 10-credit rate.
https://mcp.hasdata.com/api/mcp?apis=facebook
Contents
Related MCP server: Facebook MCP Server
What you need
An MCP client and a HasData API key from the dashboard, free to create with no card, and the free tier covers about 100 calls a month at the 10-credit rate. This is a remote server, so the simplest path is a URL and an x-api-key header, with no container to run. A client that only speaks stdio reaches it through a thin launcher, published as @hasdata/facebook-mcp on npm and hasdata-facebook-mcp on PyPI, shown below.
Quick start
The server URL is the same for every client. We run it hands-on in Claude Code and Claude Desktop. The other blocks follow each client's own documented format for a remote server.
Field | Value |
URL |
|
Transport | HTTP, streamable |
Auth header |
|
Clients with OAuth support can add the same URL as a connector and sign in without putting a key in a config file.
claude mcp add --transport http facebook "https://mcp.hasdata.com/api/mcp?apis=facebook" \
--header "x-api-key: HASDATA_API_KEY"Settings, then Connectors, then Add custom connector, then paste https://mcp.hasdata.com/api/mcp?apis=facebook and sign in.
For the config-file route, Claude Desktop loads only local (stdio) servers, so it reaches a remote server through a stdio launcher. The @hasdata/facebook-mcp package is that launcher, and it reads the key from the environment. Add this to claude_desktop_config.json:
{
"mcpServers": {
"facebook": {
"command": "npx",
"args": ["-y", "@hasdata/facebook-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}For Python instead of Node, swap the launcher for the PyPI package, which uvx runs without a manual install:
{
"mcpServers": {
"facebook": {
"command": "uvx",
"args": ["hasdata-facebook-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}~/.cursor/mcp.json for every project, or .cursor/mcp.json for one:
{
"mcpServers": {
"facebook": {
"url": "https://mcp.hasdata.com/api/mcp?apis=facebook",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json. Windsurf calls the field serverUrl, not url:
{
"mcpServers": {
"facebook": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=facebook",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}.vscode/mcp.json in the workspace:
{
"servers": {
"facebook": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=facebook",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}Example prompts
How many people like the Nike page, and how many are talking about it this week?
Pull the contact details and the confirmed owner of this Facebook page.
Read the last ten posts on this page and tell me which got the most shares.
Compare the reaction mix on this brand's posts with its competitor's.
Is this Facebook page verified, and what category does it list?
Walk this page's feed back to the start of the month and list the posts with video.
One call returns the page record and the newest post. Walking the feed takes one more call per three posts, using the token the previous response returns.
Tools
One tool, 10 credits per successful call.
Get Facebook profile
hasdata_facebook_profile_getFacebookProfile
A public page or profile, with its feed.
Tool | Credits | What it returns |
| 10 | The page record with likes, followers, contact details and owner, the newest post, the photo strip, and a token for the next three posts |
Parameter | Type | Required | Notes |
| string | yes | The username, with or without |
| string | Language the page is rendered in, one of 32 codes such as | |
| string | Cursor from the previous response, to read the next three posts |
The first call returns four blocks. profile is the page record, posts holds the newest post, photos is the strip of recent images, and pagination carries postsPerPage, nextPage and the nextPageToken to continue with.
Every call made with a token returns posts and pagination only, three posts at a time, with a fresh token until the feed ends and the token disappears.
{
"profile": {
"id": "100044541544829",
"pageId": "15087023444",
"name": "Nike",
"username": "nike",
"url": "https://www.facebook.com/nike",
"category": "Sportswear Store",
"biography": "Just Do It.",
"likesCount": 39545204,
"talkingAboutCount": 173971,
"checkInsCount": 18299,
"followersCount": "39M followers",
"followingCount": "24 following",
"verified": true,
"website": "nike.com",
"websiteUrl": "http://nike.com/",
"phone": "+48 58 881 27 61",
"owner": { "name": "NIKE, Inc.", "isConfirmed": true },
"profilePicUrl": "https://scontent.fmex5-1.fna.fbcdn.net/v/t39.30808-1/284964043_10159903868513445_7696353984967674128_n.jpg",
"coverPhotoUrl": "https://scontent.fmex25-1.fna.fbcdn.net/v/t39.30808-6/285211224_10159903868008445_5477337468887983165_n.png"
},
"posts": [
{
"id": "1393461115481927",
"url": "https://www.facebook.com/reel/2166091230582141/",
"text": "Leave your limits at the surface. #JustDoIt",
"hashtags": ["#JustDoIt"],
"timestamp": "2025-09-15T16:01:59.000Z",
"reactionsCount": 7885,
"commentsCount": 2461,
"sharesCount": 1124,
"reactions": [{ "type": "Like", "count": 6491 }],
"media": [{ "id": "2166091230582141", "type": "Video" }]
}
],
"photos": [{ "id": "1095811278580247", "type": "Photo", "image": "https://scontent.fmex22-1.fna.fbcdn.net/v/t39.30808-6/471313661_18515827156020081_2460706748949541958_n.jpg" }],
"pagination": { "postsPerPage": 3, "nextPage": 2, "nextPageToken": "eyJjdXJzb3IiOiJDZzhPYjNKbllXNXBZMTlqZFhKemIzS…" }
}Errors and failure paths
Plan for these rather than assuming a happy path.
Three of the counts are numbers and two are strings, and that is not a bug. likesCount, talkingAboutCount and checkInsCount are the exact figures Facebook publishes. followersCount and followingCount arrive as the rounded, localised text the page shows, "39M followers" in English and "39 Mio. Follower" when language is de. Compare with the numbers, display the strings.
language changes the strings, not the numbers. category moved from Sportswear Store to Sportbekleidungsgeschäft under de, while likesCount stayed a number. Pick the language for the reader, not for the maths.
A page that does not exist, was deleted or is not public still answers 200. The response then carries error instead of profile, and the call is billed. Test for profile before you read it. Groups and private personal accounts land here too.
The first page of the feed holds one post, not three. postsPerPage says 3, and pages two onward do return three, but the opening response carries the newest post alone alongside the profile and photos. Count what you got rather than what the field promises.
Later pages drop profile and photos. A call made with nextPageToken returns posts and pagination only. Keep the profile from the first response instead of expecting it again.
The token is the only way forward. nextPage is a page number for your own bookkeeping, and there is no parameter that takes it. Pass the previous nextPageToken unchanged, and stop when a response arrives without one.
Contact details are what the page shows to the request, not a canonical record. A global brand page can surface a regional phone number, and website is the display text while websiteUrl is the link. Read owner.isConfirmed before you treat the owner name as verified.
Image URLs are Facebook CDN links with signed parameters. They expire. Fetch what you need promptly and store the file, not the URL.
Results that carry data also carry a requestMetadata.id worth quoting in support.
Pricing, free tier and limits
The Facebook tool costs 10 credits per successful call. Response size does not change the price, and a page of the feed costs the same as the opening call, so a thirty-post read is one call plus ten more.
The free tier is 1,000 credits every month with no card, which is 100 Facebook calls at the base rate. It renews with the billing cycle, so a low-volume agent runs on the free tier indefinitely.
Paid plans start at $49 a month for 200,000 credits, which is 20,000 calls. The unit price falls with volume, from $2.45 per 1,000 calls on the entry plan to $1.00 on Business, $0.84 on Growth and $0.74 on the largest high-volume plans.
Your plan also sets concurrency. The free tier allows 1 request at a time, Startup 15, Business 30, Growth 50, and the high-volume plans run from 200 to 1,500. Retry on the 429 with a backoff in anything unattended, because an agent that enriches a list of pages will reach the ceiling before you do.
A request that comes back non-200 is not billed. A successful call that finds no page is still a call.
How it compares
Meta's Graph API is the official route to page data, and it is built for a different situation.
Meta Graph API | This server | |
Eligibility | A Meta developer app, an access token, and App Review for pages you do not manage | An API key |
Pages you can read | Your own pages in full, others only through reviewed permissions | Any public page or profile |
Setup | App creation, permissions, token handling, review | One header |
Post reactions | Per-type counts on pages you manage | Per-type counts on any public page |
Language of the record | Your app's locale | Any of 32, per call |
Cost | Free within rate limits | Paid past the free tier, 10 credits a call |
The row that decides it is which pages you can read. The Graph API is the right tool for pages you administer, and its Page Public Content Access permission for everything else needs a business verification and a review with a stated use case. When the page is yours, use the Graph API, it is free and complete.
FAQ
Is there an official Facebook MCP server?
Meta does not publish one for reading public pages. This one is maintained by HasData and reads public Facebook pages.
What is a Facebook MCP server?
An MCP server exposes tools an AI client can call. This one turns a public Facebook page and its feed into JSON an agent can reason over, without a browser or a scraping library in your stack.
Do I need a Facebook account or a Meta developer app?
No. The only credential is your HasData key.
Can I read a personal profile or a group?
A public personal profile works the same way as a page. Private accounts and groups are not supported and come back with the not-available error.
Can I pass a numeric id instead of a username?
Yes. Both the id and the pageId a response returns resolve as handle, so a page reached once by name can be tracked by id afterwards.
How do I read the whole feed?
Call once with the handle, then keep calling with the nextPageToken from each response until a response arrives without one. Three posts come back per token.
Why is followersCount text while likesCount is a number?
Because that is how Facebook publishes them. The like count and the talking-about count are exact on the page, and the follower count is shown rounded and localised. The response passes both through as they are.
Can I use this together with other HasData APIs?
Yes. One key covers everything, and one endpoint serves them all through the apis parameter. Point a client at ?apis=facebook,instagram to get both tool sets in one connection, or at mcp.hasdata.com/api/mcp for the full catalogue.
Is HasData affiliated with Meta or Facebook?
No. HasData is an independent service and is not affiliated with, endorsed by, or sponsored by Meta. Facebook is a trademark of its respective owner. The tools work with publicly available data only, and you are responsible for using the results in line with Meta's terms and the law that applies to you.
Compliance and personal data
A page record for a business is a business record, and a public personal profile is personal data in the plainest sense, with a name, a photo, a bio and a public feed. The tool does not tell the two apart, so your purpose has to. Keep to what your use case needs, do not build profiles of individuals you have no business with, and check your obligations under the GDPR, the CCPA and Meta's terms before storing anything. Contact details on a page are published for customers, and marketing to them is regulated separately again.
HasData links
Facebook Profile API documentation, the REST endpoint behind this tool
Other HasData MCP servers: Instagram, TikTok, YouTube, Google Search, Google Images, Google Scholar, Google Maps, Google Trends, Google Flights, Bing, DuckDuckGo, Amazon, Walmart, Shopify, Yelp, Yellow Pages, Zillow, Redfin, Airbnb, Booking.com, Indeed, Glassdoor, Web Scraping.
Development
The launcher is a thin stdio bridge to the remote server, so there is nothing to build.
npm install
HASDATA_API_KEY=your_key_here npm testThe tests in test/ assert the tool contract, the part that can break without a commit here. They check that ?apis=facebook returns the one expected tool, that its name has not changed, that it still requires handle and carries a description, that language still offers the codes this README names, and that the key in use is actually accepted.
One test reads a live page and asserts the two things this README leans on: that likesCount is a number rather than display text, and that pagination.nextPageToken arrives, because without the token the feed walk this README documents does not exist. That call costs 10 credits, which is the price of a canary that can fail for the right reason.
The contract suite also runs weekly on a schedule, because the upstream tool list can change without anyone touching this repository.
Contributing
A tool table, a response sample or a documented behaviour that does not match reality is worth an issue. There is a template for exactly that. Pull requests are welcome for the same, and for anything in the launcher.
License
MIT, see LICENSE.
Available Tools
1 toolhasdata_facebook_profile_getFacebookProfilefacebook_profile: GET /AInspect
Get Facebook Profile
Fetches a public Facebook page or profile by handle (username, @username or numeric profile id) and returns page id, name, username, category, bio, exact likes and talking-about counts, followers and following, website, phone, page owner, profile and cover photo URLs, plus the posts on the page with their text, media, reaction breakdown, comment and share counts. Walks the feed three posts per request via pagination.nextPageToken. Use to enrich company or creator records, verify a brand's reach and contact details before outreach, monitor competitor pages, or build datasets of page metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | The Facebook username of the page or profile you want to scrape, with or without the `@` symbol, or its numeric profile id (the `id` of a `profile.php?id=…` URL), e.g. `nike` or `61550916779928`. Groups and private personal accounts are not supported. | |
| language | No | Language the page is rendered in. Facebook serves a page in the language of the request, so this changes the localised strings (`followersCount`, `followingCount`, `category`) while the exact figures (`likesCount`, `talkingAboutCount`) stay numeric in every language. | |
| nextPageToken | No | Token from the `pagination.nextPageToken` field of a previous response; the page it leads to is reported as `pagination.nextPage`. Each paginated request returns the next three posts of the feed and a fresh token; the token is absent once the feed ends. Every request is billed separately. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that only public pages/profiles are supported, that feed pagination walks 'three posts per request via pagination.nextPageToken,' and that the counts are exact ('exact likes and talking-about counts'). This is substantive behavioral context beyond the schema, though it omits rate limits or failure behavior.
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 front-loaded with the operation and return fields, then gives pagination behavior and usage scenarios. The opening 'Get Facebook Profile' is redundant with the title, and the return-field sentence is long, but the content is dense and useful rather than padded.
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?
Since there is no output schema, the description does the necessary work of enumerating return fields and explaining the pagination flow. The schema fills in the remaining parameter-level details such as unsupported groups/private accounts. The main gap is no explicit statement about errors, rate limits, or billing, though billing is mentioned in the 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 coverage is 100%, and every parameter already has a rich description, including handle formats/examples, language effects, and nextPageToken pagination semantics. The description's pagination sentence mostly restates the schema's nextPageToken description, so it adds little beyond the structured 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 opens with 'Fetches a public Facebook page or profile by handle' and then enumerates the exact returned data (id, name, category, bio, likes, talking-about counts, followers, posts, etc.). This clearly states what the tool does and, because no other sibling tool targets Facebook, it is easy to distinguish from the Instagram/TikTok/YouTube profile tools.
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 concrete use cases: 'enrich company or creator records, verify a brand's reach and contact details before outreach, monitor competitor pages, or build datasets of page metadata.' It does not explicitly name alternative tools or state when not to use it, but the Facebook-specific identity and public-profile restriction provide sufficient context.
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.
1 tool update
v1.0.0- First observed
hasdata_facebook_profile_getFacebookProfile
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap. The tool's purpose is clearly defined, and it is the only available operation in the server.
The tool name follows a consistent pattern (hasdata_facebook_profile_getFacebookProfile), but since there is only one tool, there is no basis for evaluating consistency across multiple tools. The naming is descriptive and includes a provider prefix.
Having only one tool feels extremely thin for a server named 'Facebook MCP Server'. The domain of Facebook data is broad, and a single tool for profile fetching does not justify a dedicated server; it would be more appropriate as part of a comprehensive social media toolkit.
The server claims to cover Facebook data but only offers a single tool for fetching profiles. It lacks any other operations such as searching, posting, managing pages, or accessing other resource types like groups or events. This is a severely incomplete surface for the stated purpose.
Maintenance
Related MCP Connectors
Public Instagram profiles and post feeds by handle, with hashtags and mentions parsed.
Get social media data from Instagram and TikTok: profiles, posts, videos, comments, and more.
Create, schedule, and publish social posts, manage accounts, and read analytics as MCP tools.
Public TikTok profiles, videos, comments and keyword search as JSON. No developer account.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables access to the Facebook Scraper3 API to extract data from Facebook profiles, pages, groups, and the marketplace. It provides comprehensive tools for searching posts, people, and events, as well as retrieving detailed metadata for comments, reactions, and media.401MIT
- FlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server implementation that provides Facebook Page interaction and management capabilities. This server enables automated posting, comment moderation, and content retrieval.775-
- FlicenseNot gradedqualityCmaintenanceA remote MCP server that provides tools to query live Meta (Facebook+Instagram) and TikTok organic social data, such as follower counts, insights, recent posts, and aggregated overviews.-
- AlicenseAqualityCmaintenanceMCP server for Facebook Pages organic analytics and management using Meta Graph API v25.0. Enables AI assistants to read page insights, posts, comments, and publish content via natural language.937MIT