{
  "source_file": "0930",
  "source_platform": "研究机构",
  "author": "Hugging Face Blog",
  "title_listed": "Building the Hugging Face MCP Server",
  "keywords": "MCP,服务器,Agent",
  "domain": "大模型算法",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://huggingface.co/blog/building-hf-mcp",
  "publish_date": "2025-07",
  "corpus_stage": "推理部署",
  "notes": "构建Hugging Face MCP服务器",
  "id": "ca3b1c577662",
  "collected_at": "2026-10-02T15:24:43",
  "title": "Building the Hugging Face MCP Server",
  "body_markdown": "Back to Articles\nBuilding the Hugging Face MCP Server\nPublished\n\t\t\t\t\tJuly 10, 2025\nUpdate on GitHub\nUpvote\n68\n+62\nshaun smith\nevalstate\nFollow\nJulien Chaumond\njulien-c\nFollow\nEliott Coyac\ncoyotte508\nFollow\nAbubakar Abid\nabidlabs\nFollow\nTL;DR:\nThe Hugging Face Official MCP Server offers unique customization options for AI Assistants accessing the Hub, along with access to thousands of AI applications through one simple URL. We used MCPs \"Streamable HTTP\" transport for deployment, and examine in detail the trade-offs that Server Developers have.\nWe've learned many things about building a useful MCP server in the last month - we'll describe our journey here.\nIntroduction\nThe Model Context Protocol (MCP) is fulfilling its promise of being the standard to connect AI Assistants to the outside world.\nAt Hugging Face, providing access to the Hub via MCP is an obvious choice, and this article shares our experience developing the\nhf.co/mcp\nMCP Server.\nDesign Choices\nThe community uses the Hub for research, development, content creation and more. We wanted to let people customize the server for their own needs, as well as easily access thousands of AI applications available on Spaces. This meant making the MCP Server dynamic by adjusting users' tools on the fly.\nThe\nHugging Face MCP Settings Page\nwhere Users can configure their tools.\nWe also wanted to make access simple by avoiding complicated downloads and configuration, so making it remotely accessible via a simple URL was a must.\nRemote Servers\nWhen building a remote MCP Server, the first decision is deciding how clients will connect to it. MCP offers several transport options, with different trade-offs.\nTL;DR:\nour open source code supports all variants, but for production we chose to go with the most modern one. This section goes through the different options in detail.\nSince its launch in November 2024, MCP has undergone rapid evolution with 3 protocol revisions in 9 months. This has seen the replacement of the SSE Transport with Streamable HTTP, as well as the introduction and rework of authorization.\nThese rapid changes mean support for different MCP Features and revisions in Client applications varies, providing extra challenges for our design choices.\nHere is a brief summary of the Transport Options offered by the Model Context Protocol and associated SDKs:\nTransport\nNotes\nSTDIO\nTypically used when the MCP Server is running on the same computer as the Client. Able to access local resources such as files if needed.\nHTTP with SSE\nUsed for remote connections over HTTP. Deprecated in the 2025-03-26 version of MCP but still in use.\nStreamable HTTP\nA more flexible remote HTTP transport that provides more options for deployment than the outgoing SSE version\nBoth\nSTDIO\nand\nHTTP with SSE\nare fully bi-directional by default - meaning that Client and Server maintain an open connection and can send messages to each other at any time.\nSSE refers to \"Server Sent Events\" - a way for HTTP Servers to maintain an open connection and send events in response to a request.\nUnderstanding Streamable HTTP\nMCP Server Developers face a lot of choices when setting up the Streamable HTTP transport.\nThere are 3 main communication patterns to choose from:\nDirect Response\n- Simple Request/Response (like standard REST APIs). This is perfect for straightforward, stateless operations like simple searches.\nRequest Scoped Streams\n- Temporary SSE Streams associated with a single Request. This is useful for sending\nProgress Updates\nif the Tool Call takes a long time - such as Video Generation. Additionally the Server may need to request information from the user with an\nElicitation\n, or conduct a Sampling request.\nServer Push Streams\n- Long-lived SSE connection supporting server-initiated messages. This enables Resource, Tool and Prompt List change notifications or ad-hoc Sampling and Elicitations. These connections need extra management such as\nkeep-alive\nand resumption mechanics on re-connection.\nWhen using Request Scoped Streams with the official SDKs, use the\nsendNotification()\nand\nsendRequest()\nmethods provided in the\nRequestHandlerExtra\nparameter (TypeScript) or set the\nrelated_request_id\n(Python) to send messages to the correct stream.\nAn additional factor to consider is whether or not the MCP Server itself needs to maintain state for each connection. This is decided by the Server when the Client sends its Initialize request:\nStateless\nStateful\nSession IDs\nNot needed\nServer responds with an\nmcp-session-id\nWhat it means\nEach request is independent\nServer maintains client context\nScaling\nSimple horizontal scaling: any instance can handle any request\nNeed session affinity or shared state mechanisms\nResumption\nNot needed\nMay replay messages for broken connections\nThe table below summarizes the MCP Features and their supported communication pattern:\nMCP Feature\nServer Push\nRequest Scoped\nDirect Response\nTools, Prompts, Resources\nY\nY\nY\nSampling/Elicitation\nServer Initiated at any time\nRelated to a Client initiated request\nN\nResource Subscriptions\nY\nN\nN\nTool/Prompt List Changes\nY\nN\nN\nTool Progress Notification\n-\nY\nN\nWith Request Scoped streams, Sampling and Elicitation requests need a Stateful connection so that the\nmcp-session-id\ncan be used for response association.\nThe\nHugging Face MCP Server\nis Open Source - and supports STDIO, SSE and Streamable HTTP deployment in both Direct Response and Server Push mode. You can configure keep-alive and last activity timeouts when using Server Push Streams. There's also a built-in observability dashboard that you can use to understand how different Clients manage connections, and handle Tool List change notifications.\nThe following picture shows our MCP Server connection dashboard running in \"Server Push\" Streamable HTTP mode:\nThe Hugging Face MCP Server Connection Dashboard.\nProduction Deployment\nFor production, we decided to launch our MCP Server with Streamable HTTP in a Stateless, Direct Response configuration for the following reasons:\nStateless\nFor anonymous users we supply a standard set of Tools for using the Hub along with an Image Generator. For authenticated users our state comprises their\nselected tools\nand chosen Gradio applications. We also make sure that users ZeroGPU quota is correctly applied for their account. This is managed using the supplied\nHF_TOKEN\nor OAuth credentials that we  look up on request. None of our existing tools require us to maintain any other state between requests.\nYou can use OAuth login by adding\n?login\nto the MCP Server url - e.g.\nhttps://huggingface.co/mcp?login\n. We may make this the default once the\nclaude.ai\nremote integration supports the latest OAuth spec.\nDirect Response\nprovides the lowest deployment resource overhead - and we don't currently have any Tools that require Sampling or Elicitation during execution.\nFuture Support\nAt launch, the \"HTTP with SSE\" transport was still the remote default in a lot of MCP Clients. However, we didn't want to invest heavily in managing it due to its imminent deprecation. Fortunately, popular clients had already started making the switch (VSCode and Cursor), and within a week of launch\nclaude.ai\nalso added support. If you need to connect with SSE, feel free to deploy a copy of our Server on a\nFreeCPU Hugging Face Space\n.\nTool List Change Notifications\nIn the future, we would like to support real-time Tool List Changed notifications when users update their settings on the Hub. However, this raises a couple of practical issues:\nFirst, users tend to configure their favourite MCP Servers in their Client and leave them enabled. This means that the Client remains connected whilst the application is open. Sending notifications would mean maintaining as many open connections as there were currently active Clients - regardless of active usage - on the chance the user updates their tool configuration.\nSecond, most MCP Servers and Clients disconnect after a period of inactivity, resuming when necessary. This inevitably means that immediate push notifications would be missed - as the notification channel will have been closed. In practice, it is far simpler for the Client to refresh the connection and Tool List as needed.\nUnless you have reasonable control over the Client/Server pair, using\nServer Push Streams\nadds a lot of complexity to a public deployment, when lower-resource solutions for refreshing the Tool List exist.\nURL User Experience\nJust before launch,\n@julien-c\nsubmitted a PR to include friendly instructions for users visiting\nhf.co/mcp\n. This hugely improves the User Experience - the default response is otherwise an unfriendly bit of JSON.\nInitially, we found this generated an enormous amount of traffic. After a bit of investigation we found that when returning a web page rather than an HTTP 405 error, VSCode would poll the endpoint multiple times per second!\nThe fix suggested by\n@coyotte508\nwas to properly detect browsers and only return the page in that circumstance. Thanks also to the VSCode team who rapidly\nfixed it\n.\nAlthough not specifically stated - returning a page in this manner\ndoes\nseem acceptable within the MCP Specification.\nMCP Client Behaviour\nThe MCP Protocol sends several requests during initialization. A typical connection sequence is:\nInitialize\n,\nNotifications/Initialize\n,\ntools/list\nand then\nprompts/list\n.\nGiven that MCP Clients will connect and reconnect whilst open, and the fact that users make periodic calls, we find there is a ratio of around 100 MCP Control messages for each Tool Call.\nSome clients also send requests that don't make sense for our Stateless, Direct Response configuration - for example Pings, Cancellations or attempts to list Resources (which isn't a capability we currently advertise).\nThe first week of July 2025 saw an astonishing 164 different Clients accessing our Server. Interestingly, one of the most popular tools is\nmcp-remote\n. Approximately half of all Clients use it as a bridge to connect to our remote server.\nConclusion\nMCP is rapidly evolving, and we're excited about what has already been achieved across Chat Applications, IDEs, Agents and MCP Servers over the last few months.\nWe can already see how powerful integrating the Hugging Face Hub has been and support for Gradio Spaces now makes it possible for LLMs to be easily extended with the latest\nMachine Learning applications\n.\nHere are some great examples of things people have been doing with our MCP Server so far:\nOrchestrating Video Production\nImage Editing\nDocument Searching\nAI Application Development\nAdding Reasoning to existing Models\nWe hope that this post has provided insights to the decisions that need to be made building Remote MCP Servers, and encourage you to try some of the examples in your favourite MCP Client.\nTake a look at our\nOpen Source MCP Server\n, and try some of the different transport options with your Client, or open an Issue or Pull Request to make improvements or suggest new functionality.\nLet us know your thoughts, feedback and questions on this\ndiscussion thread\n.\nMore Articles from our Blog\nmultimodal\nnlp\ncommunity\nTraining and Finetuning Multimodal Embedding & Reranker Models with Sentence Transformers\n83\nApril 16, 2026\nmultimodal\nnlp\ncommunity\nMultimodal Embedding & Reranker Models with Sentence Transformers\n75\nApril 9, 2026\nCommunity\nburtenshaw\nJul 10, 2025\nGreat read!\nReply\nEdit\nPreview\nUpload images, audio, and videos by dragging in the text input, pasting, or\nclicking here\n.\nTap or paste here to upload images\nComment\n·\nSign up\nor\nlog in\nto comment\nUpvote\n68\n+56",
  "metadata": {
    "title": "Building the Hugging Face MCP Server",
    "description": "We’re on a journey to advance and democratize artificial intelligence through open source and open science.",
    "keywords": null,
    "author": null,
    "og:title": "Building the Hugging Face MCP Server",
    "og:description": "We’re on a journey to advance and democratize artificial intelligence through open source and open science.",
    "og:type": "website",
    "og:url": "https://huggingface.co/blog/building-hf-mcp",
    "og:image": "https://huggingface.co/blog/assets/building-hf-mcp/building-hf-mcp.png",
    "twitter:card": "summary_large_image",
    "twitter:site": "@huggingface",
    "twitter:image": "https://huggingface.co/blog/assets/building-hf-mcp/building-hf-mcp.png"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [],
  "images": [
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/no-auth/-F1LruCk2wfRbQ54eCs9G.png",
      "bytes": 10170,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-50cf84f1bb573e81b864.png",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/no-auth/-F1LruCk2wfRbQ54eCs9G.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/avatars/562c38e275f51d1c95af1024487cc92b.svg",
      "bytes": 397,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-8edb02ee7780a9db14aa.svg",
      "src": "https://huggingface.co/avatars/562c38e275f51d1c95af1024487cc92b.svg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/6388cbf2d68e37abd59bd66f/V39BFiGxbg2sPk8mq6RGR.png",
      "bytes": 9936,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-97ef517373b2f59a4fd3.png",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/6388cbf2d68e37abd59bd66f/V39BFiGxbg2sPk8mq6RGR.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/avatars/1e8186075cd7aec14d26f8c4ed6f2d52.svg",
      "bytes": 1283,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-abf800ad97297ae3b157.svg",
      "src": "https://huggingface.co/avatars/1e8186075cd7aec14d26f8c4ed6f2d52.svg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/noauth/HXKKlyDzNjei5x-6w7gL2.jpeg",
      "bytes": 4976,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-793be18f70e1a3fbb28f.jpeg",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/noauth/HXKKlyDzNjei5x-6w7gL2.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/avatars/7a198dc8e8e1adad2ec172beba50f1b0.svg",
      "bytes": 397,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-8e7ddf2033437eb53cc7.svg",
      "src": "https://huggingface.co/avatars/7a198dc8e8e1adad2ec172beba50f1b0.svg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hf-mcp-remote/hf-mcp-settings.png",
      "bytes": 76770,
      "reused": true,
      "local_path": "attachments/ca3b1c577662/images/003.png",
      "src": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hf-mcp-remote/hf-mcp-settings.png",
      "alt": "The Hugging Face MCP Settings Page",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hf-mcp-remote/hf-mcp-connections.png",
      "bytes": 83829,
      "reused": true,
      "local_path": "attachments/ca3b1c577662/images/004.png",
      "src": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hf-mcp-remote/hf-mcp-connections.png",
      "alt": "The Hugging Face MCP Server Connection Dashboard",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://huggingface.co/blog/assets/train-sentence-transformers/st-hf-thumbnail.png",
      "bytes": 129194,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-3f59e95de0cdb130c49c.png",
      "src": "https://huggingface.co/blog/assets/train-sentence-transformers/st-hf-thumbnail.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/6317233cc92fd6fee317e030/cJHSvvimr1kqgQfHOjO5n.png",
      "bytes": 5138,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-4846b3d76d1e92e2d185.png",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/6317233cc92fd6fee317e030/cJHSvvimr1kqgQfHOjO5n.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/62d648291fa3e4e7ae3fa6e8/oatOwf8Xqe5eDbCSuYqCd.png",
      "bytes": 4308,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-2f7cd9aaae2da43f9642.png",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/62d648291fa3e4e7ae3fa6e8/oatOwf8Xqe5eDbCSuYqCd.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/6640bbd0220cfa8cbfdce080/wiAHUu5ewawyipNs0YFBR.png",
      "bytes": 4508,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-f215cef2141effa79fc7.png",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/6640bbd0220cfa8cbfdce080/wiAHUu5ewawyipNs0YFBR.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/5f17f0a0925b9863e28ad517/78BR8GuQiX9a8wbbRlSAC.webp",
      "bytes": 4234,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-ebab6432c5fe9e0ae211.webp",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/5f17f0a0925b9863e28ad517/78BR8GuQiX9a8wbbRlSAC.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/6050eb5aeb94f56898c08e57/FBDyc4s4mVTmFYfR4Jcng.jpeg",
      "bytes": 7298,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-0040603e45152c3595b2.jpeg",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/6050eb5aeb94f56898c08e57/FBDyc4s4mVTmFYfR4Jcng.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/63d10d4e8eaa4831005e92b5/7p7-OmWM6PqqCs7ZStPGD.jpeg",
      "bytes": 6266,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-0fa65c31245fc0f66c84.jpeg",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/63d10d4e8eaa4831005e92b5/7p7-OmWM6PqqCs7ZStPGD.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/62d6c40ba71903fb4c1e3261/SQGmYShjtveXBf8HVpxPp.jpeg",
      "bytes": 12254,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-4742eedeb30dab6ddb85.jpeg",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/62d6c40ba71903fb4c1e3261/SQGmYShjtveXBf8HVpxPp.jpeg",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://cdn-avatars.huggingface.co/v1/production/uploads/6192895f3b8aa351a46fadfd/gsGa2PvHTKAv7MNbyLH8y.jpeg",
      "bytes": 7850,
      "reused": false,
      "local_path": "attachments/ca3b1c577662/images/body-707fedc850d22eaacfe4.jpeg",
      "src": "https://cdn-avatars.huggingface.co/v1/production/uploads/6192895f3b8aa351a46fadfd/gsGa2PvHTKAv7MNbyLH8y.jpeg",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://huggingface.co/blog",
      "label": "Back to Articles",
      "type": "a"
    },
    {
      "href": "https://github.com/huggingface/blog/blob/main/building-hf-mcp.md",
      "label": "Update on GitHub",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/login?next=%2Fblog%2Fbuilding-hf-mcp",
      "label": "Upvote 68",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/sheebz",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/gn00029914",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/jkorstad",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/SoumadipBanerjee",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/iamsingularity",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/JoshuaMB",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/evalstate",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/julien-c",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/coyotte508",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/abidlabs",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://hf.co/mcp",
      "label": "hf.co/mcp",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/settings/mcp",
      "label": "Hugging Face MCP Settings Page",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/specification/2025-06-18/basic/utilities/progress",
      "label": "Progress Updates",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation",
      "label": "Elicitation",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/specification/2025-06-18/basic/utilities/ping",
      "label": "keep-alive",
      "type": "a"
    },
    {
      "href": "https://github.com/evalstate/hf-mcp-server",
      "label": "Hugging Face MCP Server",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/new-space",
      "label": "FreeCPU Hugging Face Space",
      "type": "a"
    },
    {
      "href": "https://github.com/microsoft/vscode/pull/251288/files",
      "label": "fixed it",
      "type": "a"
    },
    {
      "href": "https://github.com/geelen/mcp-remote",
      "label": "mcp-remote",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/blog/gradio-mcp-servers",
      "label": "Machine Learning applications",
      "type": "a"
    },
    {
      "href": "https://x.com/victormustar/status/1937095435316822244",
      "label": "Orchestrating Video Production",
      "type": "a"
    },
    {
      "href": "https://x.com/reach_vb/status/1942247029515735263",
      "label": "Image Editing",
      "type": "a"
    },
    {
      "href": "https://x.com/NielsRogge/status/1940472422790242561",
      "label": "Document Searching",
      "type": "a"
    },
    {
      "href": "https://x.com/llmindsetuk/status/1940358288220336514",
      "label": "AI Application Development",
      "type": "a"
    },
    {
      "href": "https://www.linkedin.com/posts/ben-burtenshaw_im-a-big-fan-of-local-models-in-lmstudio-activity-7344001099533590528-zNyw",
      "label": "Adding Reasoning to existing Models",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/spaces/huggingface/README/discussions/26",
      "label": "discussion thread",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/blog/train-multimodal-sentence-transformers",
      "label": "multimodal nlp community Training and Finetuning Multimodal Embedding & Reranker Models with Sentence Transformers 83 Ap",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/blog/multimodal-sentence-transformers",
      "label": "multimodal nlp community Multimodal Embedding & Reranker Models with Sentence Transformers 75 April 9, 2026",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/burtenshaw",
      "label": "burtenshaw",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/join?next=%2Fblog%2Fbuilding-hf-mcp",
      "label": "Sign up",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/John6666",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/victor",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/echarlaix",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/m-ric",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/kramp",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://huggingface.co/celinah",
      "label": "",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:53:33Z",
  "source_url": "https://huggingface.co/blog/building-hf-mcp",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 11553,
  "expected_body_images": 17,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/ca3b1c577662/pages/source.html",
  "local_html": "attachments/ca3b1c577662/pages/article.html",
  "body_base_path": "attachments/ca3b1c577662/pages/",
  "body_markdown_path": "attachments/ca3b1c577662/pages/article.md"
}