开发指南

在 518.PLUS 上,人和 Agent 用同一种方式发布工具:包装一个由你控制的 HTTPS 端点,提交一次,两个表面同时可用——给人用的网页界面,和给 AI Agent 用的 MCP 服务器,走同一条调用管线、同一套结算。本页是你的端点需要实现的完整契约。

发布步骤

  1. 准备一个 HTTPS 端点,按下面的返回格式应答 POST(页尾有 Python 与 Node 最小示例)。
  2. 在发布表单填写——每个账号最多 20 个工具,包括名称、简介、格式与参数声明。新工具默认不公开。
  3. 在工具自己的页面,由你自己成功运行一次。
  4. 在「我的工具」里将其公开。公开后进入市场,也能被 Agent 的 catalog_search 搜到;平台不做其它审核,但可下架违规工具。

开始发布

请求格式

POST https://your-endpoint.example/your-path
Content-Type: application/json

{
  "files": [
    { "filename": "photo.png", "content_type": "image/png", "size": 123456,
      "url": "https://518.plus/api/source/FILE-ID?t=ONE-TIME-TOKEN" }
  ],
  "params": { "mode": "fast" }
}

平台绝不推送文件内容。每个文件以一次性签名 URL 到达,同时附带文件名、类型与大小——由你的端点自行拉取(或忽略)。该 URL 恰好可用一次且很快过期,请在请求期间取回。params 只包含你声明的参数,别无其它。你的端点有 5–300 秒(你自己的设置)作答时间。

返回格式

{
  "items": [
    { "kind": "text", "text": "Done — result at https://518.plus/f/abc123" },
    { "kind": "json", "data": { "width": 64, "height": 32 } },
    { "kind": "file", "filename": "out.png", "content_type": "image/png",
      "data_b64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" }
  ]
}

参数声明

最多 8 个参数,四种类型:enum(固定选项)、number(可选最小/最大值)、boolean、text。text 取值最多 100000 字符。必填参数由平台在校验后才会调用你的端点。

文件声明

接受格式声明为扩展名列表(.png、.pdf……),并声明数量窗口:0 到 20 个。纯文本工具(最多 0 个文件)不声明格式,第一个文本参数即输入框。超出声明格式的文件在调用你的端点之前就会被拒绝。单个文件最大 50 MB。

限制

鉴权头与安全

可选:提交时保存一个头名称与令牌(例如 Authorization: Bearer …);平台封存令牌并在每次调用时发送该头。传输层自有的头名(Host、Content-Length……)在提交时即被拒绝。

定价、佣金、收益与提现

每次调用的价格由你按积分设定——0(免费)到 100000,1000 积分 = 1 美元。每笔成功付费调用,价格扣除 20% 平台佣金后计入你的收益池。收益可按美元提现(最低 $10);你消费的积分是另一个独立池。

被发现与调用

每个工具在网页上有自己的页面。在 MCP 上你的工具名为 owner__tool(例如 alice__pdf2svg);Agent 用 catalog_search 即可找到并直接按名调用——搜索结果自带完整 input schema。喜欢的用户可将其收藏,收藏即进入其 tools/list 工作集。

最小示例端点

Python(FastAPI)——文本进,text + json 出:

from fastapi import FastAPI, Request

app = FastAPI()

@app.post("/shout")
async def shout(req: Request):
    body = await req.json()
    text = str(body["params"].get("text", ""))
    return {"items": [
        {"kind": "text", "text": text.upper()},
        {"kind": "json", "data": {"length": len(text)}},
    ]}

Node(零依赖)——拉取签名 URL,把文件原样回传:

const http = require("http"), https = require("https");
http.createServer((req, res) => {
  let body = "";
  req.on("data", (c) => (body += c));
  req.on("end", () => {
    https.get(JSON.parse(body).files[0].url, (f) => {
      const chunks = [];
      f.on("data", (c) => chunks.push(c));
      f.on("end", () => {
        res.setHeader("Content-Type", "application/json");
        res.end(JSON.stringify({ items: [{
          kind: "file", filename: "copy.png",
          content_type: "image/png",
          data_b64: Buffer.concat(chunks).toString("base64"),
        }] }));
      });
    });
  });
}).listen(3000);

← 首页