protogrid

Search / vn.eno/partner-api

eno.vn Partner API

R1· needs a key

Manage one storefront: listings, bulk catalogue sync, analytics and webhooks.

v1.0.1 · active · website · descriptor JSON · versions

An agent can connect on its own if it already holds api_key.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality89new
Trust83of 100
Uptime, 30 days100%
Latency p50936 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "partner-api": {
      "type": "http",
      "url": "https://eno.vn/api/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
claude mcp add --transport http partner-api https://eno.vn/api/mcp --header "Authorization: Bearer ${api_key}"
[mcp_servers.partner-api]
url = "https://eno.vn/api/mcp"
bearer_token_env_var = "api_key"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "partner-api": {
      "type": "remote",
      "url": "https://eno.vn/api/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:api_key}"
      }
    }
  }
}
{
  "mcpServers": {
    "partner-api": {
      "type": "http",
      "url": "https://eno.vn/api/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=partner-api&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vZW5vLnZuL2FwaS9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIgJHthcGlfa2V5fSJ9fQ%3D%3D"
}
{
  "servers": {
    "partner-api": {
      "type": "http",
      "url": "https://eno.vn/api/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
{
  "mcpServers": {
    "partner-api": {
      "httpUrl": "https://eno.vn/api/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
extensions:
  "partner-api":
    enabled: true
    name: "partner-api"
    type: streamable_http
    uri: "https://eno.vn/api/mcp"
    headers:
      "Authorization": "Bearer ${api_key}"
    timeout: 300

Placeholders to fill from your own secret store: ${api_key}. The registry never accepts secret values.

Quality 89 / 100new

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations15 of 15 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 4,808 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
  • pass
    tools.hidden_textno hidden text in tool names, descriptions, schemas or annotations
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pull, stability.new_linkstool history recorded for 2 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

15 tools, about 4,808 tokens to load them all · tool set f9935655f318 · tools last changed 2026-11-14 · checked 2026-11-14 06:30 UTC

Tool changes

  • delete_webhookchangedoutput schema
  • register_webhookchangedinput schema, output schema
  • list_webhookschangedoutput schema
  • analytics_listingschangedinput schema, output schema
  • analytics_summarychangedoutput schema
  • sync_cataloguechangedinput schema, output schema
  • bulk_create_listingschangedinput schema, output schema
  • delete_listingchangedinput schema, output schema
  • set_listing_statuschangedinput schema, output schema
  • update_listingchangedoutput schema

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-1d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://eno.vn/api/mcp streamable-httpapi_key ${api_key}yes100%936 ms2025-06-182026-11-14

Tools (15)

analytics_listingsread-onlyRead views and leads (times a buyer opened contact) per listing per day over a date range, the last 30 days unless you choose one, with each listing's all-time totals. Answers a page of listings at a time with `next_cursor` for the next. Use analytics_summary for the shop's overall totals. Changes nothing.
analytics_summaryread-onlyRead this shop's totals in one call: how many listings it has, how many are active, sold or hidden, how many still wait for eno's check, and the total views and leads (times a buyer opened contact) across all of them. For per-listing, per-day figures use analytics_listings. Changes nothing.
bulk_create_listingsPost up to 200 new listings in one call, one row each (category, title, price in VND, optional text and photos as public image URLs). Rows are independent: a bad row fails alone and the others are created. Returns how many were created and failed, and a result per row with the new id or the reason it failed. To keep eno matched to your own system by your own ids, use sync_catalogue instead.
create_listingPost one new listing for this shop: a category, a title and a price in VND (a job gives its monthly salary in `salaryM` instead), with optional text, location, condition and photos as public image URLs that eno copies to its own storage (the first 8 are used). Longer text is cut to fit: title 140 characters, description 5,000, district 80, condition 60. The listing goes live at once unless eno must check it first (`verified: false` in the result). Refused with a reason, and nothing created, when the text holds a phone number, the category is unknown or the account may not post right now. Returns the new listing's `id` (for update_listing and set_listing_status), `verified` (true when it is already public) and `held` (true while it waits for eno's licence check). Use it for a listing the seller has asked to post.
delete_listingdestructivePermanently delete one of this shop's listings; it cannot be undone (use set_listing_status hidden to take it down instead). While the shop or the listing is under investigation (an open report, or the account is held or suspended) it is hidden instead of deleted: the result then says `deleted: false, hidden: true` and why.
delete_webhookdestructiveRemove one of this shop's webhook endpoints; eno stops sending it events at once. It cannot be undone: registering the address again gives a new id and a new secret.
get_listingread-onlyRead one of this shop's listings by id, in any status, with all its fields: title, text, price, status, category, location, photos, views and leads. Use it to see the current values before update_listing. Fails with `not_found` when the id is not one of this shop's listings. Changes nothing.
get_shopread-onlyRead the storefront this connection acts for: its id, name, bio, location, phone, logo, trust score and tier, response rate, member-since date and how many listings are live now. Use it to confirm which shop this connection acts for. Changes nothing.
list_listingsread-onlyList this shop's own listings, newest first, in every status unless you ask for one: active (on sale), sold or hidden. Each page returns the listings with price, status, category and photos, plus `next_cursor` to fetch the next page. Use get_listing to read one listing by id. Changes nothing.
list_webhooksread-onlyList the webhook endpoints registered for this shop: where events are sent, which events, whether delivery is on, and recent failures. Signing secrets are never returned. Changes nothing.
register_webhookRegister an HTTPS endpoint of yours that eno will POST signed events to when this shop's listings are created, updated, change status or are deleted. Returns the webhook with its signing secret, shown only this once: store it to verify each event's signature. A shop can have up to 10 webhooks.
set_listing_statusdestructivePut one of this shop's listings on sale (active), mark it sold, or hide it from the site without deleting it. Use sold when the item is gone and hidden to take it down for now; either can be undone by setting active again. Re-activating is refused with a reason when the account is held or suspended, or with `licence_check_required` while the listing waits for eno's licence check. Returns the status the listing now has.
sync_cataloguedestructiveMake this shop's listings match your own catalogue, matched by your externalId: a new externalId creates a listing, a known one updates it in place, and a row's status can mark it sold or hidden. In mode "full", every active listing whose externalId is missing from this payload is also hidden (listings without an externalId, such as ones posted on the website, are never touched). Up to 200 rows per call. Returns counts of created, updated, retired and failed rows and a result per row; when the account may not publish new listings, new rows are refused while edits still apply, and `publish_blocked` says why.
update_listingdestructiveChange one of this shop's listings: only the fields you send change. Photos you send replace the current set (public URLs are copied to eno's storage; the first 8 are used), and text is cut to the same lengths as create_listing. A job's pay is `salaryM`; a `price` sent for a job is read as its monthly salary in VND. An edit of a listing waiting for eno's licence check is saved with the listing kept unpublished until eno approves it (the result says `held: true`); this tool cannot change a subcategory or the licence values.
update_shopdestructiveChange this shop's profile: the name, bio, location and logo buyers see on its page, and the contact phone eno shares with a buyer inside its chat. Send only the fields to change; the others stay as they are (get_shop shows the current values). Long text is shortened to fit: name 120 characters, bio 1,000, location 120; a name needs at least 2. A phone number another shop already uses is refused with `phone_taken`. Returns `ok: true` once the change is saved.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "vn.eno/partner-api",
  "icons": [
    {
      "src": "https://eno.vn/icon-512.png",
      "sizes": [
        "512x512"
      ],
      "mimeType": "image/png"
    }
  ],
  "title": "eno.vn Partner API",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://eno.vn/api/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "value": "Bearer {api_key}",
          "isSecret": true,
          "variables": {
            "api_key": {
              "format": "string",
              "isSecret": true,
              "isRequired": true,
              "description": "Partner API key, issued in the eno.vn dashboard under Developers. An OAuth 2.0 access token from /api/v1/oauth/token works here too.",
              "placeholder": "eno_live_…"
            }
          },
          "isRequired": true,
          "description": "Bearer credential for one shop, set in the client and sent on every request. No tool takes it as an argument."
        }
      ]
    }
  ],
  "version": "1.0.1",
  "websiteUrl": "https://eno.vn/developers/mcp",
  "description": "Manage one storefront: listings, bulk catalogue sync, analytics and webhooks."
}