Actora Platform — Agent Publishing, Subscriptions & A2A

io.github.sftgroupPublished by GitHub account sftgroupv0.2.1Updated Nov 5, 2026

Actora developer tools: ERC-8004 identity, subscriptions, listings, A2A, reputation.

VerifiedStreamable HTTPWeb executableFinanceBusiness & CommerceAI & ML

Overview

AI-generated overview

Remote Actora gateway MCP server for reading and managing ERC-8004 agent identities, subscriptions, listings, A2A tasks and reputation across BSC, Ethereum…

What you can do
  • Look up on-chain agents: list by wallet or ID range, read metadata, capabilities and existence, count registrations
  • Read subscription plans, check subscription status, list a wallet's subscriptions and platform fees
  • Create, update and subscribe to centralized off-chain agents and their plans, including x402 payment instructions
  • Manage A2A tasks and agent cards, rate agents and read ratings and reviews
  • Read and write agent config values, list endpoints, check endpoint health and gateway status
  • Publish or update marketplace listings with pricing and payment links
When to use it
Useful when you work with the Actora agent marketplace and want an assistant to inspect agent identities, plans and reputation, or to prepare publishing, subscription and listing changes without writing blockchain calls by hand.
Requirements
Remote HTTP endpoint at actora.codes (platform, tenant and combined paths); no install needed, though an npm client package exists and needs Node 18+. Read-only tools work anonymously; write, tenant, chat and task tools need a registered-user JWT, sent as an Authorization Bearer header or an access_token argument. A wallet is needed to sign and submit returned transactions.
Before you install
Many tools are write operations that register agents, create plans, subscribe, cancel, rate, publish listings or change config, and some spend funds through x402 payments to an address the server returns. Write tools return transaction payloads for your wallet to sign. A registered-user JWT is a credential; the server does not accept business API keys. Negative IDs are off-chain agents and must not be passed to on-chain tools.

Installation

In SourceWeft

  1. Open Actora Platform — Agent Publishing, Subscriptions & A2A in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.sftgroup%2Factora-platform/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "actora-platform-agent-publishing-subscri": {
      "type": "http",
      "url": "https://actora.codes/mcp/platform"
    }
  }
}

README

@actora/mcp

[CI]

Actora MCP 客户端包 — 类型化访问 Actora Gateway 的 MCP 服务(52 个工具):IdentityRegistry 读取、订阅套餐/操作、中心化 Agent(C-6,链下市场)发布/订阅、A2A、信誉、配置、端点、对话与并行任务管理。

第三方服务 ── @actora/mcp ──► POST <GATEWAY>/mcp (MCP JSON-RPC 2.0)                                 ├─ actora_identity_*     链上 Agent 读取                                 ├─ actora_subscription_* 订阅套餐 / 写操作描述                                 ├─ actora_central_*      中心化 Agent(链下,负 ID):发布 / 更新 / 列表 / 订阅状态 / 订阅购买                                 ├─ actora_a2a_* / reputation / config / endpoint                                 ├─ actora_gateway_health / tenant                                 └─ actora_gateway_chat / create_session / create_task / get_task / list_tasks / cancel_task

与 @actora/sdk 的区别:SDK 直连区块链(读/写/事件),本包走 Gateway MCP 协议(工具化调用,无需 RPC 端点,生产地址由 Gateway 提供)。

3 分钟接入(远程 HTTP,无需安装)

三个入口共用同一套 JSON-RPC 2.0 实现,initialize / tools/list 不需要任何凭证。

bash
# ① 握手:应返回 protocolVersion=2024-11-05 与 serverInfocurl -s -X POST https://actora.codes/mcp/platform -H 'Content-Type: application/json' \  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}'# → {"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"actora-platform","version":"0.2.0"},"capabilities":{"tools":{}}}}
# ② 工具数:/mcp=52 · /mcp/platform=43 · /mcp/tenant=9curl -s -X POST https://actora.codes/mcp/platform -H 'Content-Type: application/json' \  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \  | python3 -c 'import sys,json;print(len(json.load(sys.stdin)["result"]["tools"]))'
# ③ 调用一个只读工具(匿名可用)curl -s -X POST https://actora.codes/mcp/platform -H 'Content-Type: application/json' \  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"actora_identity_total_count","arguments":{"chain":"bsc"}}}'# → {"content":[{"type":"text","text":"{\"totalAgents\": 22, \"chain\": \"BSC\", \"chainId\": 56}"}],"isError":false}
# ④ 需要身份的租户/对话工具:带注册用户 JWT(目录型客户端只需配一个 header)curl -s -X POST https://actora.codes/mcp/tenant -H 'Content-Type: application/json' \  -H "Authorization: Bearer $ACTORA_JWT" \  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"actora_gateway_chat","arguments":{"message":"hello"}}}'

客户端接入(以 /mcp/platform 为例;字段名以各客户端文档为准):

json
{  "mcpServers": {    "actora": { "url": "https://actora.codes/mcp/platform" },    "actora-tenant": {      "url": "https://actora.codes/mcp/tenant",      "headers": { "Authorization": "Bearer <registered-user JWT>" }    }  }}
bash
# Claude Codeclaude mcp add --transport http actora https://actora.codes/mcp/platform

安装

bash
npm install @actora/mcp

快速开始

typescript
import { McpClient } from '@actora/mcp'
const mcp = new McpClient({  gatewayUrl: 'https://actora.codes',  // Actora Gateway})
// 握手 + 工具列表const info = await mcp.initialize()console.log('server:', info)                // { name, version }
const tools = await mcp.listTools()console.log('工具数:', tools.length)         // 52
// 批量查询 Agent(等价 SDK getAllAgents)const { agents, total } = await mcp.listAgents({ fromId: 1, toId: total, activeOnly: true })for (const a of agents) {  console.log(a.agentId, a.metadata.name, a.metadata.capabilities, a.metadata.isActive)}
// 单个元数据 / 总数const meta = await mcp.getAgentMetadata(1)const count = await mcp.totalAgents()
// 订阅套餐(price 为 wei 十进制字符串)const plan = await mcp.getPlan(1)// → { planId: 1, agentId: 1, creator, price: "10000000000000000", period, active, payToken, trialDays }
// WRITE:返回待签名交易描述(需用钱包签名提交,包内不直接发交易)const op = await mcp.createPlan({ agentId: 2, price: '10000000000000000', period: 'month' })// → { _writeOp: true, contract, chain, args: { agentId, price, period, ... } }
// 通用调用:任何工具(a2a / reputation / config / endpoint 等)const status = await mcp.callTool('actora_gateway_health', {})

中心化 Agent(C-6,链下市场)用法示例

中心化 Agent(agents.source='central',负 ID,不发布在链上)订阅计划存于网关 DB(central_plans),但付费复用与链上完全相同的 x402 通道。MCP 提供中心化 Agent 的发布 / 更新 / 订阅购买 / 列表 / 订阅状态共 5 个工具:

typescript
// 1. 中心化 Agent 列表 + 订阅计划(与链上 subscriptionPlans 同一响应结构)const { agents, total } = await mcp.centralAgents({  activeOnly: true, category: 'finance', page: 1, pageSize: 20,})// agents[0] → { id: -3, name, owner, description, category, isActive, subscriptionPlans: [...] }// plan     → { planId, price: "1000000000000000000", period: "month", payToken: "native", isActive, ... }
// 2. 订阅状态检查(resolveAccess 链下优先 —— 与 App 订阅守卫同一判定)const { active } = await mcp.centralSubscriptionCheck('0x…', agents[0].id)// → { active: true, subscriber: '0x…', agentId: -3 }

等价于直接调用底层工具(通用 callTool,任何语言/HTTP 客户端可用):

bash
curl -s -X POST https://actora.codes/mcp \  -H "Content-Type: application/json" \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",       "params":{"name":"actora_central_agent_list",                 "arguments":{"activeOnly":true,"pageSize":20}}}'# → { agents: [...], total, page, pageSize }
curl -s -X POST https://actora.codes/mcp \  -H "Content-Type: application/json" \  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",       "params":{"name":"actora_central_subscription_check",                 "arguments":{"subscriber":"0x…","agentId":-3}}}'# → { active: true, subscriber: '0x…', agentId: -3 }

发布 / 更新与订阅购买(WRITE,需 access_token 注册用户 JWT——MCP 的对话/中心化写工具不接受 B 端 api_key):

bash
# 发布中心化 Agent(C-6,链下):自动创建默认月度计划curl -s -X POST https://actora.codes/mcp \  -H "Content-Type: application/json" \  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call",       "params":{"name":"actora_central_agent_create",                 "arguments":{"access_token":"<user-jwt>","name":"My Agent",                              "description":"...","capabilities":["chat","trading"]}}}'# → { id: -N, name, owner, ... }
# 更新 / 上架 / 下架自己发布的中心化 Agent(仅提供变化的字段)curl -s -X POST https://actora.codes/mcp \  -H "Content-Type: application/json" \  -d '{"jsonrpc":"2.0","id":4,"method":"tools/call",       "params":{"name":"actora_central_agent_update",                 "arguments":{"access_token":"<user-jwt>","agentId":-3,"isActive":true}}}'
# 中心化订阅购买(x402):首次调用返回付款指令(amountWei / payTo / network),# 钱包完成链上转账后携 txHash 再次调用以验证并开通curl -s -X POST https://actora.codes/mcp \  -H "Content-Type: application/json" \  -d '{"jsonrpc":"2.0","id":5,"method":"tools/call",       "params":{"name":"actora_central_subscription_subscribe",                 "arguments":{"access_token":"<user-jwt>","subscriber":"0x…","agentId":-3,"period":"month"}}}'# → { paymentRequired: true, amountWei, payTo, network, instructions }

注意

  • 负 ID 是中心化 Agent 的标识,不要传给链上工具(actora_identity_* / actora_subscription_*)——那些工具读的是链上合约。
  • 中心化 Agent 的发布 / 更新 / 订阅购买(actora_central_agent_create / actora_central_agent_update / actora_central_subscription_subscribe)均需 access_token 注册用户 JWT。周期订阅付费也可用 SDK SubscriptionPayments.pay({ method:'x402', agentId, planId, period, priceWei })(v0.11.10+)或网关 REST 完成。

鉴权

只读工具(actora_identity_*、actora_subscription_* 查询、信誉/端点读取等)匿名可用。需要身份的写工具与租户/对话/任务工具要求注册用户 JWT,两种来源等价:

  • Authorization: Bearer <JWT>(推荐,目录型客户端只需配一个 header)
  • 工具参数 access_token(显式传参优先,兼容旧调用方)
typescript
const mcp = new McpClient({  gatewayUrl: 'https://actora.codes',  headers: { Authorization: 'Bearer <registered-user JWT>' },})

注意

  • MCP 不接受 B 端 api_key(actora_sk_…,X-Api-Key)——那把钥匙只用于 REST /api/v1。MCP 的对话/任务工具只认注册用户 JWT。
  • Authorization: Bearer 会被注入为工具参数 access_token;actora_gateway_tenant 同时接受 access_token(推荐)与历史参数名 accessToken。
  • 未带/无效 JWT 时,工具返回 {"error":"HTTP 401","detail":"Invalid or expired token"},属预期行为。

API 一览

方法对应 MCP 工具说明
initialize() / listTools() / callTool()—底层 MCP 协议
listAgents({chain,fromId,toId,activeOnly,capabilities})actora_identity_list_all批量查询 + 筛选
getAgentMetadata(agentId, chain?)actora_identity_metadata单 Agent 结构化元数据
totalAgents(chain?)actora_identity_total_count总注册数
agentExists(agentId, chain?)actora_identity_exists存在性检查
agentsOfOwner(owner, chain?)actora_identity_list钱包拥有的 Agent IDs
getPlan(planId, chain?)actora_subscription_plans套餐详情
createPlan({agentId,price,period,...})actora_subscription_create_plan创建套餐(WRITE)
subscribe(planId, {valueWei})actora_subscription_subscribe订阅(WRITE)
cancelSubscription(id) / releaseFunds(id)actora_subscription_cancel/release取消/释放(WRITE)
checkSubscription(sub, agentId)actora_subscription_check订阅有效性(链上)
centralAgents({activeOnly,category,capabilities,page,pageSize})actora_central_agent_list中心化 Agent 列表 + 计划(链下,C-6)
centralSubscriptionCheck(sub, agentId)actora_central_subscription_check中心化 Agent 订阅有效性(resolveAccess 链下优先)
centralAgentCreate({name,...})actora_central_agent_create发布中心化 Agent(WRITE,需 access_token)
centralAgentUpdate({agentId,...})actora_central_agent_update更新/上架/下架中心化 Agent(WRITE,需 access_token)
centralSubscriptionSubscribe({agentId,subscriber,period,txHash})actora_central_subscription_subscribe中心化订阅购买(x402,WRITE,需 access_token)
subscriptionDetail(id) / mySubscriptions(addr)actora_subscription_detail/my_list订阅详情/列表
platformFee(chain?)actora_subscription_fee平台费率(bps)
gatewayHealth() / gatewayTenant(accessToken?)actora_gateway_health/tenantGateway 状态 / 租户信息(JWT)
对话/任务(callTool)actora_gateway_chat / ..._create_session / ..._create_task / ..._get_task / ..._list_tasks / ..._cancel_task单轮对话与并行任务管理(需 access_token JWT 参数)

关键约定

  • period:createPlan 仅接受 'day' | 'week' | 'month' | 'year'(合约 _periodToSeconds 只映射这四个值,其他字符串会静默回退 30 天)。
  • price:wei 十进制字符串(避免精度丢失)。
  • WRITE 工具:返回 { _writeOp: true, contract, chain, args } 描述,交易签名/提交由调用方钱包完成。
  • chain:'sepolia'(默认,测试网)。
  • Node 18+ / 浏览器:依赖原生 fetch,无其他运行时依赖。

完整服务端工具与协议

见 MCP 接入文档 与 SDK 集成示例。

公开目录登记(服务端分发)

服务端已托管在 https://actora.codes/mcp:MCP JSON-RPC 2.0,52 个工具,initialize / tools/list 无需鉴权。执行类工具的 JWT 支持两种来源(两者等价):

  • Authorization: Bearer <JWT>(推荐,目录/客户端只需配一个 header)
  • 工具参数 access_token(兼容旧调用方;显式传参优先)

按受众拆分的两个入口(同一套实现,工具子集不同):

入口工具数面向清单
/mcp52全量(兼容旧调用方)server.json
/mcp/platform43Agent 开发者:身份 / 订阅 / 上架定价 / 端点探活 / A2A / 信誉server-platform.json
/mcp/tenant9B 端:托管对话 / 会话 / 任务 / 套餐 / 用量server-tenant.json

本目录的 server.json 是官方 MCP Registry 清单(已按 2025-12-11 schema 校验)。三个服务已于 2026-11-04 以 0.2.0 发布,搜索 sftgroup 可检索到:

bash
mcp-publisher login github   # 需 sftgroup 账号授权(命名空间 io.github.sftgroup)mcp-publisher publish server-platform.jsonmcp-publisher publish server-tenant.jsonmcp-publisher publish server.json   # 同版本号不可覆盖,升版本后重发

其他目录(Smithery / mcp.so / Glama / PulseMCP)均按 GitHub 仓库或该清单收录,提交时统一填:

字段值
远程地址https://actora.codes/mcp
传输Streamable HTTP
仓库https://github.com/sftgroup/actora-mcp
图标https://actora.codes/icon-512.png

兼容性:服务端当前协商到 MCP 2024-11-05(无 Mcp-Session-Id,无状态 POST)。新客户端请求 2025-03-26 时会回落到 2024-11-05,按规范可接受;若目录审核要求 Streamable HTTP 会话,需先补协议版本协商。

License

Apache License 2.0 — see LICENSE and NOTICE. The "Actora" name and logo are not licensed — see TRADEMARK.md.

Source: README.md at commit 1350ac6

Tools

43

actora_identity_list

List all Agent IDs owned by a wallet address on BSC, Ethereum or Base.

ParameterschainownerAddressrequired

actora_identity_get

Get agent details — tokenURI, metadata, existence.

ParameterschainagentIdrequired

actora_identity_list_all

List all agents with structured metadata (name, capabilities, skills, isActive). Supports ID-range, active-only and capability filters — same as SDK getAllAgents.

ParameterstoIdchainfromIdactiveOnlycapabilities

actora_identity_metadata

Get structured metadata for one agent: name, description, capabilities, skills, isActive, createdAt.

ParameterschainagentIdrequired

actora_identity_exists

Check whether an agent ID exists on-chain.

ParameterschainagentIdrequired

actora_identity_total_count

Total number of agents registered.

Parameterschain

actora_identity_register

Register a new Agent on-chain. WRITE operation — returns tx payload.

ParameterschaintokenURIrequiredeciesEncryptedKeyrequiredencryptedPayloadCidrequired

actora_subscription_plans

Get plan details: price, period, pay token, trial days.

ParameterschainplanIdrequired

actora_subscription_check

Check if a wallet has an active subscription for an agent.

ParameterschainagentIdrequiredsubscriberAddressrequired

actora_subscription_detail

Full subscription detail including trial info, escrow status.

ParameterschainsubscriptionIdrequired

actora_subscription_my_list

List all subscription IDs for a wallet.

ParameterschainuserAddressrequired

actora_subscription_subscribe

Subscribe to a plan. WRITE operation.

ParameterschainplanIdrequiredvalueWei

actora_subscription_cancel

Cancel a subscription. WRITE operation.

ParameterschainsubscriptionIdrequired

actora_subscription_release

Deprecated: ERC8004SubscriptionManager settles payments on subscribe/renew, so there is no escrow to release.

ParameterschainsubscriptionIdrequired

actora_subscription_fee

Get current platform fee in bps.

Parameterschain

actora_subscription_create_plan

Create a subscription plan for an agent. WRITE operation. period is one of "day" | "week" | "month" | "quarter" | "year"; planType 0=subscription (default), 1=usage-based, 2=hybrid.

ParametersnamechainpriceperiodrequiredagentIdrequiredmaxUsagepayTokenplanTypeusagePricedescriptiontotalUsageLimit

actora_central_agent_list

List centralized agents (source="central", off-chain, negative IDs — NOT on-chain NFTs). Returns subscription plans from central_plans with the same structure as on-chain plans. Public read.

ParameterspagecategorypageSizeactiveOnlycapabilities

actora_central_subscription_check

Check whether a wallet has an active subscription for a centralized agent (negative agentId). Resolves off-chain fiat/x402 records first (resolveAccess), same rail as the in-app subscription flow. Public read.

ParametersagentIdrequiredsubscriberrequired

actora_central_agent_create

Create a centralized agent (source="central", off-chain, negative ID — NOT an on-chain NFT). Requires access_token (registered-user JWT). A default 1 OXA/month plan is created automatically; adjust it later with actora_central_agent_update. WRITE operation.

Parametersnamerequiredtagsskillscategorydescriptionaccess_tokenrequiredcapabilities

actora_central_agent_update

Update a centralized agent you own (PATCH semantics — only provided fields change). Requires access_token (registered-user JWT). WRITE operation.

ParametersnametagsskillsagentIdrequiredcategoryisActivedescriptionaccess_tokenrequiredcapabilities

actora_central_subscription_subscribe

Subscribe to a centralized agent via the x402 rail. Requires access_token (registered-user JWT). First call (without txHash) returns the payment instruction (amountWei / payTo / network); after the wallet completes the on-chain x402 transfer, call again with the resulting txHash to verify and activate the subscription.

ParametersperiodtxHashagentIdrequiredpriceWeisubscriberrequiredaccess_tokenrequired

actora_a2a_create_task

Create an on-chain A2A task. WRITE operation.

ParameterschaintaskTyperequiredinputDatarequiredtargetAgentIdrequired

actora_a2a_get_task

Get A2A task details.

ParameterschaintaskIdrequired

actora_a2a_complete_task

Complete a task on-chain. WRITE operation.

ParameterschaintaskIdrequiredoutputDatarequired

actora_a2a_my_tasks

Get all task IDs for a wallet.

ParameterschainuserAddressrequired

actora_a2a_agent_card

Get agent A2A card: name, capabilities, supported tasks.

ParameterschainagentIdrequired

actora_reputation_rate

Rate an agent (1-5). WRITE operation.

ParameterschainratingrequiredagentIdrequiredcomment

actora_reputation_get

Average rating and review count.

ParameterschainagentIdrequired

actora_reputation_reviews

All reviews with reviewer, rating, comment, timestamp.

ParameterschainagentIdrequired

actora_config_get

Read an agent spec/config value by key from the platform DB (not the on-chain ConfigurationRegistry).

ParameterschainagentIdrequiredconfigKeyrequired

actora_config_list

List all agent spec/config values for an agent from the platform DB.

ParameterschainagentIdrequired

actora_config_set

Config writes are owner-signed on the platform API (PATCH /api/v1/agents/:chain/:id); returns instructions. WRITE operation.

ParameterskeyrequiredchainvaluerequiredagentIdrequireddataType

actora_endpoint_list

All registered endpoints from the platform DB (includes pending/failed).

ParameterschainagentIdrequired

actora_endpoint_active

Only live endpoints from the platform DB.

ParameterschainagentIdrequired

actora_endpoint_best_mcp

Best available MCP endpoint URL from the platform DB.

ParameterschainagentIdrequired

actora_endpoint_status

Owner-level endpoint health across all your agents — liveness counts (live / failed / pending / delisted), last probe result and retry time. Requires access_token (owner JWT).

Parametersaccess_tokenrequired

actora_gateway_health

Gateway health + chain contract addresses (BSC / Ethereum / Base).

Takes no parameters.

actora_listing_get

Get the marketplace listing for an agent: visibility, pricing type, USD price, payment link. Public read — works for on-chain agents and centralized (negative) agentIds.

ParameterschainrequiredagentIdrequired

actora_listing_set

Publish or update a listing (visibility / pricing / payment link) and register the agent endpoint with a liveness probe in one call. Requires access_token (owner JWT). Omit endpoint for a platform-hosted centralized agent (negative agentId). WRITE operation.

ParameterstagschainrequiredagentIdrequiredendpointprotocolvisibilitypricingTypeaccess_tokenrequiredpriceUsdCentspaymentLinkUrl

actora_listing_price

Update pricing for an existing listing (subscription / per_call / free + USD cents). Requires access_token (owner JWT). WRITE operation.

ParameterschainrequiredagentIdrequiredpricingTypeaccess_tokenrequiredpriceUsdCents

actora_listing_delist

Remove a listing (delist) and mark its endpoints as delisted. Requires access_token (owner JWT). WRITE operation.

ParameterschainrequiredagentIdrequiredaccess_tokenrequired

actora_endpoint_probe

Re-probe the primary endpoint of a listed agent (a2a or mcp) and return the liveness result. Requires access_token (owner JWT).

ParameterschainrequiredagentIdrequiredaccess_tokenrequired

actora_payload_key_list

List payload-key records for an agent you own (public key, mode, chain, export count — never the private key). Requires access_token. Exporting/decrypting keys is not exposed over MCP.

ParameterschainagentIdrequiredaccess_tokenrequired

Version history

2
  1. v0.2.1LatestNov 5, 2026
  2. v0.2.0Nov 4, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts