HelloAsso

io.github.edouard-claude由 GitHub 账号 edouard-claude 发布v0.1.1更新于 Nov 2, 2026

HelloAsso for associations: members, tickets, donations, payments, refunds, checkouts.

已验证STDIO仅桌面金融商业与电商

概览

AI 生成的概览

该 MCP 服务器封装 HelloAsso v5 API,让助手查询协会的会员、票务、捐赠、支付、退款与结账信息。

可以做什么
  • 读取组织、表单、订单、条目与支付,并按周期汇总实际收款金额
  • 在 HelloAsso 公开目录中搜索组织、表单与标签
  • 创建结账意图与支付链接,并查看其结果
  • 创建活动、变更表单状态、取消订单与退款,均需显式确认
  • 将某笔结算明细导出为 JSON、CSV 或 Excel
  • 使用内置提示词生成财务报告、查询个人记录、导出参会名单与发起退款申请
适用场景
适合协会或非营利组织的财务与运营人员,用自然语言向助手询问收款情况、会员缴费、活动报名名单或退款事宜,数据与其对账所用的 HelloAsso 账户一致。
运行要求
以本地进程运行(预编译二进制、cargo install 或已发布的容器镜像),通过 stdio 通信,也可用绑定地址与 bearer token 走 HTTP。需要协会后台获取的 HelloAsso API 客户端 id 与密钥,分别通过 HELLOASSO_CLIENT_ID 和 HELLOASSO_CLIENT_SECRET 设置,并需访问 HelloAsso API 的网络。HELLOASSO_ENVIRONMENT 选择生产或沙箱环境。
安装前请注意
客户端密钥是访问协会支付数据的真实凭据,勿写入共享配置或日志。写入类工具会动钱:退款、取消订单、删除表单与移除 webhook 均需 confirm: true,退款还可能要求 MFA 参数。建议先用 HELLOASSO_READ_ONLY=1 屏蔽所有写入工具。若在回环地址之外提供 HTTP 服务,应设置 HELLOASSO_HTTP_TOKEN 并在前面加 TLS。

安装

在 SourceWeft 中

  1. 打开 控制台中的 HelloAsso,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

mcp-helloasso

Your association's HelloAsso, answered by asking.

A single Rust binary that puts the whole HelloAsso v5 API — memberships, tickets, donations, payments, refunds, checkouts — in front of any MCP client.

[Rust] [MCP] [HelloAsso API] [Transports] [CI] [Release] [License] [MCP Registry] [Glama] [Stars]

🇫🇷 Serveur MCP pour HelloAsso : adhérents, billetterie, dons, paiements et remboursements, interrogés en langage naturel depuis Claude, Cursor ou tout client MCP.


Ask your assistant "how much did we collect last month?", "is Camille Martin's membership paid?", "give me the attendee list of the gala" — and get the answer from the same HelloAsso your treasurer reconciles against.

console
> how much did we collect in September, and on what?
  summarize_payments   2026-09 · 214 payments read                       collected   8 342,00 €   (196 authorized)                       Membership/adhesion-2026     5 160,00 €   61.9%                       Event/gala-2026              2 730,00 €   32.7%                       Donation/dons                  452,00 €    5.4%                       by means: Card 7 912,00 € · Sepa 430,00 €                       refunded 60,00 € · 3 refused · 1 contested
> who registered for the gala, with their dietary answers?
  list_form_items      form_url = helloasso.com/associations/les-amis-du-velo/evenements/gala-2026                       item_states = Processed, Registered · with_details = true                       87 participants, 3 tiers, custom field "Régime alimentaire"

Paste a HelloAsso URL, say last month, name a person. The server resolves the organization, the form, the period and the pagination.

Why

HelloAsso's API is a clean REST surface, but handing it raw to a language model goes wrong in predictable ways: amounts are cents, a form is a (type, slug) pair nobody remembers, date ranges are half-open, tokens expire every 30 minutes, and the one call that matters most — a refund — sends real money back with no undo.

  • The whole API, nothing hidden. All 36 routes of the public v5 spec, one tool each, plus whoami and summarize_payments, which exist because the API has no "who am I" for a client and no aggregate. A test fails if that count ever drops.
  • URLs, words and periods, not identifiers. Every form tool takes the form's public URL. Form types read in English, French or URL spelling (evenements, adhésions). Periods read last month, 2026-09, last 30 days. Persons are found with search.
  • Money that adds up. summarize_payments walks every page and splits what was actually collected (Authorized) per form, payment means and month, in cents and euros — no model adding up page one and calling it a total.
  • Fail-closed where money moves. refund_payment and cancel_order refuse to run without confirm: true, and the refusal states the amount and the payer so the confirmation is an informed one. HELLOASSO_READ_ONLY=1 withholds every write tool.
  • OAuth handled the way HelloAsso asks. client_credentials once, then refresh_token — never a new grant while a refresh works, as the API requires. A token revoked server-side is renewed transparently.
  • Written for a model to read. Structured output with schemas on all 38 tools, annotations on every one, four prompts that stop and ask before touching money, and server instructions that say up front: amounts are cents.

Install

Prebuilt binary (macOS, Linux, Windows)

Download the archive for your platform from the latest release, check it against its .sha256, and put mcp-helloasso on your PATH:

bash
# macOS on Apple silicon; swap the target for x86_64-apple-darwin,# x86_64-unknown-linux-gnu or aarch64-unknown-linux-gnuV=v0.1.1 T=aarch64-apple-darwincurl -LO https://github.com/edouard-claude/helloasso-mcp/releases/download/$V/mcp-helloasso-$V-$T.tar.gztar xzf mcp-helloasso-$V-$T.tar.gzsudo mv mcp-helloasso-$V-$T/mcp-helloasso /usr/local/bin/

Windows: take the x86_64-pc-windows-msvc.zip archive.

From source (any platform with Rust 1.88+)
bash
git clone https://github.com/edouard-claude/helloasso-mcpcd helloasso-mcpcargo build --release# the binary is at target/release/mcp-helloasso
With cargo install
bash
cargo install --git https://github.com/edouard-claude/helloasso-mcp
With Docker
bash
docker run --rm -i \  -e HELLOASSO_CLIENT_ID=… -e HELLOASSO_CLIENT_SECRET=… \  ghcr.io/edouard-claude/helloasso-mcp:latest

Or build it yourself with docker build -t mcp-helloasso ..

The server is listed in the official MCP registry as io.github.edouard-claude/helloasso-mcp, so registry-aware clients offer it directly with the variables to fill in.

The image runs unprivileged and speaks stdio by default; add --http for the HTTP transport. See Run it over HTTP instead.

Get API credentials

In the HelloAsso back office of your association: My account → Integrations and API (Mon compte → Intégrations et API). You get a client id and a client secret, with the AccessPublicData, AccessTransactions and Checkout privileges, scoped to your organization. Partners get theirs from HelloAsso's partnership team.

Then check the wiring before pointing a client at it:

bash
HELLOASSO_CLIENT_ID=… HELLOASSO_CLIENT_SECRET=… mcp-helloasso --check
console
environment  productionbase url     https://api.helloasso.com/v5toolsets     organization, forms, sales, checkout, directory, partnerread only    falsetools        38token        okreachable    1 organization(s)             Les Amis du Vélo (les-amis-du-velo) as OrganizationAdminorganization Les Amis du Vélo (les-amis-du-velo)
ready.

Configure

VariableRequiredDefaultWhat it is
HELLOASSO_CLIENT_IDyesThe API client id
HELLOASSO_CLIENT_SECRETyesIts secret
HELLOASSO_CLIENT_SECRET_FILEA file holding the secret instead, for Docker secrets
HELLOASSO_ACCESS_TOKENInstead of a client: a ready-made bearer token, used as is
HELLOASSO_ENVIRONMENTproductionsandbox targets api.helloasso-sandbox.com
HELLOASSO_ORGANIZATIONThe organization slug tools default to
HELLOASSO_TOOLSETSallorganization,forms,sales,checkout,directory,partner
HELLOASSO_READ_ONLY01 withholds every write tool
HELLOASSO_TIMEOUT_SECS30Per-request timeout
HELLOASSO_MAX_RETRIES3Retries on 429 and transient 5xx
HELLOASSO_BASE_URLper environmentAPI root override
HELLOASSO_TOKEN_URLper environmentToken endpoint override
HELLOASSO_HTTP_BINDListen address for the HTTP transport
HELLOASSO_HTTP_TOKENBearer token the HTTP transport requires
HELLOASSO_LOGinfowarn, debug, mcp_helloasso=debug…

Which organization. An association's client reaches exactly one organization, and the server finds it on its own. A partner client reaching several gets the list back as candidates; set HELLOASSO_ORGANIZATION or pass organization per call. The binary refuses to start on a malformed variable and names the one at fault.

Connect a client

Claude Code
bash
claude mcp add helloasso --scope user \  --env HELLOASSO_CLIENT_ID=… \  --env HELLOASSO_CLIENT_SECRET=… \  -- /absolute/path/to/mcp-helloasso
Claude Desktop

claude_desktop_config.json:

json
{  "mcpServers": {    "helloasso": {      "command": "/absolute/path/to/mcp-helloasso",      "env": {        "HELLOASSO_CLIENT_ID": "…",        "HELLOASSO_CLIENT_SECRET": "…",        "HELLOASSO_READ_ONLY": "1"      }    }  }}

Start read-only; lift it once you trust the setup.

Cursor, Windsurf, Zed, and other stdio clients

Same shape: one command pointing at the binary, the credentials in env. The server speaks the stdio transport and prints nothing but protocol on stdout — logs go to stderr.

Any client, over HTTP

Point it at http://127.0.0.1:8080/mcp after starting the server with --http 127.0.0.1:8080. See below.

Then ask "which HelloAsso organization are you connected to?". whoami should answer with your association's name.

Tools

38 tools in six toolsets, covering the 36 routes of the public v5 spec. HELLOASSO_TOOLSETS picks which ones are registered; HELLOASSO_READ_ONLY=1 keeps only the ones that declare themselves read-only.

sales — orders, items, payments, the treasurer's view

ToolRoute
summarize_paymentscompositeTotals over a period: collected, per form, means, month, refunds
list_ordersGET /organizations/{org}/ordersOrders, by period, person or form type
list_form_ordersGET …/forms/{type}/{slug}/ordersThe orders of one form
get_orderGET /orders/{id}One order: payer, items, payments, refund eligibility
cancel_orderPOST /orders/{id}/cancelStop future instalments — confirm: true
list_itemsGET /organizations/{org}/itemsTickets, memberships, donations: the people
list_form_itemsGET …/forms/{type}/{slug}/itemsAn event's attendees, a campaign's members
get_itemGET /items/{id}One item, with custom fields and ticket URL
list_paymentsGET /organizations/{org}/paymentsPayments, by period, person or state
list_form_paymentsGET …/forms/{type}/{slug}/paymentsThe payments of one form
get_paymentGET /payments/{id}One payment, with refund operations and receipts
refund_paymentPOST /payments/{id}/refundFull or partial refund, MFA-aware — confirm: true
export_cash_outGET /organizations/{org}/cash-out/{id}/exportA payout's detail, JSON, CSV or Excel

forms — the campaigns

ToolRoute
list_formsGET /organizations/{org}/formsEvery form, by state and type
list_form_typesGET /organizations/{org}/formTypesThe types in use
get_formGET …/forms/{type}/{slug}/publicA form in full: tiers, prices, custom fields
get_form_statsGET …/forms/{type}/{slug}/statsParticipants and sales per tier
quick_create_eventPOST …/forms/Event/action/quick-createAn event with tiers, in one call
update_form_statePUT …/forms/{type}/{slug}/statePublish, hide, disable — deleting needs confirm: true
list_activity_typesGET /values/form/{type}/typesSubtypes for a form type

checkout — payment links

ToolRoute
create_checkout_intentPOST /organizations/{org}/checkout-intentsA payment link for an amount, in one go or instalments
get_checkout_intentGET /organizations/{org}/checkout-intents/{id}Its outcome, and the order once paid

organization — who and what

ToolRoute
whoamicompositeEnvironment, client, default organization and its profile
get_organizationGET /organizations/{org}An organization's public profile
list_my_organizationsGET /users/me/organizationsThe organizations this client holds a role on
list_organization_categoriesGET /values/organization/categoriesReference list
list_company_legal_statusesGET /values/company-legal-statusReference list

directory — HelloAsso's public directory

ToolRoute
search_organizationsPOST /directory/organizationsBy name, place, category, tag
search_formsPOST /directory/formsBy text, place, dates, type, price, tag
get_tagGET /tags/{name}One tag, with usage count and amount
list_public_tagsGET /values/tagsEvery public tag

partner — for HelloAsso partners

ToolRoute
get_partnerGET /partners/meThe partner account
list_partner_organizationsGET /partners/me/organizationsOrganizations that authorized the partner
update_partner_domainPUT /partners/me/api-clientsThe OAuth redirect domain
set_notification_urlPUT /partners/me/api-notificationsThe webhook URL, main or per event type
delete_notification_urlDELETE /partners/me/api-notificationsRemove it — confirm: true
set_organization_notification_urlPUT /partners/me/api-notifications/organizations/{org}Per-organization webhook
delete_organization_notification_urlDELETE /partners/me/api-notifications/organizations/{org}Remove it — confirm: true

Resources and prompts

Three resources and two templates, for clients that prefer attaching context to calling a function:

URI
helloasso://organizationThe default organization's profile
helloasso://formsIts forms
helloasso://my-organizationsEvery organization the client reaches
helloasso://forms/{form_type}/{form_slug}One form in full
helloasso://orders/{order_id}One order in full

Four prompts drive the workflows associations actually run:

  • treasury_report — totals, per-campaign split, means, refunds and what stands out, in French number formatting. Writes nothing.
  • find_person — everything one person did: memberships, tickets, payments, what is pending. Writes nothing.
  • attendee_list — every participant of a form with their answers, walked to the last page and checked against the form's statistics. Writes nothing.
  • refund_request — find the payment, check eligibility, propose, stop and wait, then refund and read it back.

HelloAsso, as it actually behaves

Everything below was checked against the live API, is handled for you, and is written down because the next person integrating HelloAsso will hit the same walls.

What happensWhat this server does
Access tokens last 30 minutes, and HelloAsso requires renewing them with the refresh_token rather than a new grantRenews a minute early, refresh first, new grant only if the refresh is refused
A token can be revoked before it expiresA 401 drops the token and retries once with a fresh one
Amounts are integers in cents everywhereSaid in the server instructions and every tool description; summarize_payments adds euros
A form is addressed by (organization, type, slug)Every form tool also takes the public URL, and French type names
Date filters are half-open: to is exclusivePeriods (2026-09, last month) are converted to the right [from, to)
Arrays in query strings are repeated keys (states=A&states=B)Built that way, never comma-joined
Errors come in three envelopes: HelloAsso's errors[], ASP.NET's validation map, OAuth's errorAll three read into one message with the code in the error's data
A 403 says only insufficient PrivilegesNames the privilege the spec requires for that route, and who grants it
An association's own client cannot call the directory, tag, activity-type or partner routes (FormOpenDirectory, OrganizationOpenDirectory, FormAdministration, partner client)Those tools stay registered for partners; with an association client they answer which privilege is missing
Most listings (orders, items, payments, directory) report -1 for totals and pages, and paginate by continuation token-1 is dropped rather than shown as a count; the token is surfaced, and summarize_payments walks it to the end
Refunds are protected by strong authenticationThe MFA headers are exposed as optional arguments; the error says which one is needed
quick-create only supports eventsExposed as quick_create_event, which says so
The cash-out export picks JSON, CSV or Excel from the Accept header, and its CSV starts with a byte-order markexport_cash_out takes a format and strips the BOM
Its CDN refuses requests without a User-AgentEvery request carries mcp-helloasso/<version>
429 and transient 5xxRetried with backoff, honouring Retry-After

Safety

Reading a treasury is sensitive; changing it is more so. The defaults lean careful.

  • Money is fail-closed. refund_payment, cancel_order, deleting a form and removing a webhook refuse without confirm: true. A refused refund reads the payment first and says "payment 67890 (25.00 € by Camille Martin, Authorized) would be refunded in full", so the person confirms what they actually see. All four are annotated destructiveHint.
  • Read-only is structural. HELLOASSO_READ_ONLY=1 drops every route that does not annotate itself readOnlyHint — not a list of names to keep in sync, so a new write tool is excluded by construction. A test asserts it.
  • Inputs are checked before HTTP. Slugs cannot escape their path segment, checkout terms must add up to the total, URLs must be https://, ids must be positive.
  • The secret never leaks. It is redacted in Debug, sent only to the token endpoint, and never serialized into a tool answer or a log line; whoami shows the first eight characters of the client id and nothing of the secret.
  • No disk writes over HTTP. export_cash_out's save_to is refused when the server is reached over HTTP.
  • The prompts ask first. The only prompt that can move money stops for explicit approval, and asks for the MFA code rather than guessing.

Run it over HTTP instead

bash
mcp-helloasso --http 127.0.0.1:8080# MCP at http://127.0.0.1:8080/mcp, health at /healthz

Off loopback, the server refuses to start without HELLOASSO_HTTP_TOKEN: one API client means one identity, and an open endpoint is an open door to an association's payments. With the token set, every request to /mcp needs Authorization: Bearer <token>; /healthz stays open for probes. All sessions share one OAuth token.

bash
docker run -d --name mcp-helloasso -p 8080:8080 \  -e HELLOASSO_CLIENT_ID=… \  -e HELLOASSO_CLIENT_SECRET=… \  -e HELLOASSO_HTTP_BIND=0.0.0.0:8080 \  -e HELLOASSO_HTTP_TOKEN="$(openssl rand -hex 32)" \  mcp-helloasso

Put TLS in front of it. The process speaks plain HTTP and does not pretend otherwise.

Verify

bash
cargo test                                   # 79 testscargo clippy --all-targets -- -D warningscargo fmt --all --checkmcp-helloasso --list-tools                   # the surface, as registeredmcp-helloasso --check                        # the configuration, against the live API

The suite includes the protocol itself: tests/mcp_stdio.rs spawns the real binary, speaks JSON-RPC to its stdin and asserts on what comes back — the handshake, all 38 tools with their schemas, a form named by URL, a period turned into dates, a summary that only counts collected money, a refund refused without confirmation and sent with its MFA header with it, read-only mode. tests/api_contract.rs holds the token lifecycle, the retries and the error envelopes against a fake HelloAsso, and tests/mcp_http.rs checks the HTTP transport and its bearer guard.

src/├── client.rs      REST over HTTP: OAuth2 lifecycle, retries, the three error envelopes├── config.rs      the environment, validated once, with the secret redacted├── resolve.rs     URLs, slugs and form types, and the refusal to guess├── dates.rs       today, last month, 2026-09, last 30 days├── tools/         one module per toolset, one function per route├── resources.rs   three URIs and two templates├── prompts.rs     four workflows that ask before touching money└── server.rs      capabilities, instructions, and the glue

Releasing

Bump version in Cargo.toml, add its section to CHANGELOG.md, then push a tag:

bash
git tag v0.1.1 && git push origin v0.1.1

The release workflow checks the tag against Cargo.toml and the changelog, builds the five binaries with their checksums, pushes ghcr.io/edouard-claude/helloasso-mcp, and publishes the GitHub release with the changelog section as notes.

Contributing

Issues and pull requests welcome. A change is ready when cargo test, cargo clippy --all-targets -- -D warnings and cargo fmt --all --check pass, and when a new tool carries a description, an annotation and an output schema — three tests will tell you if it does not.

License

MIT — see LICENSE. Not affiliated with HelloAsso; HelloAsso is a trademark of its owner.

来源:README.md,提交 d039a24

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Oct 19, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分