← MCP servers · bobberrisford

Affiliate Networks MCP

BLOCKgrade F · trust 39/100

affiliate network MCPs and skills

Overview

From the repository's own README, as read at the audited commit.

# affiliate-mcp> Integrate your affiliate networks with Claude or Codex.[![npm version](https://img.shields.io/npm/v/affiliate-networks-mcp?label=release)](https://www.npmjs.com/package/affiliate-networks-mcp) ![networks](https://img.shields.io/badge/networks-72-blue) ![adapters](https://img.shields.io/badge/adapters-86-blue) [![maintained by](https://img.shields.io/badge/maintained%20by-community%20%2F%20networks-orange)](./docs/networks)> **Network operators:** most adapters are community-built and `experimental`. Adoption gives your team ownership and a verification path; promotion to `partial` or `production` still requires current evidence and maintainer review. Find your network's issue under the [`adopt-this-network`](https://github.com/bobberrisford/affiliatemcp/issues?q=is%3Aissue+is%3Aopen+label%3Aadopt-this-network) label.Affiliate networks have two sides — and neither has a first-class AI workspace integration.**Publishers** earn commissions from the programmes they join.**Brands** (and the agencies who manage them) run those programmesand pay the commissions out. I wanted to chat to my own affiliatedata in the AI workspace I already use; none of the networks had shipped anintegration for either side, so I built a broad beta set that covers bothpublisher and advertiser-side work.If you're a **publisher**, you can ask:> *"What did I earn across all networks last month?"*>> *"Which programmes have transactions still pending after 90 days?"*>> *"Compare my earnings month on month."*If you're on the **brand side** — running a programme, or an agencymanaging several — you can ask:> *"How is Acme's programme doing this quarter?"*>> *"Show me revenue across all my clients this week."*>> *"Any anomalies in the affiliate data?"*Your AI workspace figures out which networks to call, fetches the data live fromtheir APIs, and gives you the answer. You can use Claude or Codex to turn itinto a sheet, an artifact, an email to your boss, whatever you want.Free and open s

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add affiliate-networks-mcp -- npx -y [email protected]

Exposed tools (57) 51 read · 6 write · 0 destructive

ToolRiskDescription
advertiserIdreadAwin advertiser/programme ID.
affiliate-earnings-reportread
affiliate-network-statusread
affiliate_build_brand_snapshotreadPull one brand\
affiliate_get_brand_action_bundlereadAssemble the input bundle for the brand AI deliverables (a quarterly business review or a weekly report): the latest persisted snapshot, the brand\
affiliate_get_brand_rowsreadReturn the persisted 30-day, transaction-grain rows for a brand: as structured rows, as inline CSV, or (format
affiliate_get_client_strategyreadRead the advisory strategy and KPI context an operator has recorded for one brand (the brand slug from brands.json).
affiliate_list_actionswriteList the doing-surface actions (advisement, write, and known gaps) the configured adapters declare, with channel, effect, default authority tier, and local readiness.
affiliate_list_client_strategiesreadList which brands have advisory strategy recorded, covering both brands bound in brands.json and any client directory on disk.
affiliate_list_networksreadList the affiliate networks this server has adapters registered for, along with their adapter version, claim_status, and whether the user has configured credentials for each.
affiliate_query_brand_datawriteRun a read-only analytical query (filters, group-bys, sums, top-N) over the persisted 30-day brand dataset and return a small, exact result.
affiliate_resolve_brandreadList the logical brands the operator has bound in brands.json, optionally filtered by network slug.
affiliate_run_diagnosticwriteRun a capabilities diagnostic across one or all registered affiliate networks.
affiliate_set_client_strategywriteWrite the advisory Strategy.md and/or KPI.md for one brand (the brand slug from brands.json) to the local config directory.
agency-portfolio-deepdiveread
agency-portfolio-rollupread
audit-affiliate-linksread
awin_daily_performance_briefreadBuild a concise Awin publisher performance brief from advertiser reports and transactions.
awin_link_builder_workflowreadGuide link generation for an Awin advertiser with membership and quota checks.
awin_offer_finderreadFind Awin promotions or vouchers that fit a publisher campaign or content brief.
awin_programme_opportunity_scanreadAssess Awin programmes before a publisher decides what to promote next.
awin_transaction_investigationreadInvestigate pending, reversed, unpaid, or specific Awin transactions.
campaignreadOptional Awin campaign parameter.
destinationUrlreadDestination URL to deeplink to.
echo_toolreadEchoes.
exclusiveOnlyreadtrue to show exclusive offers only.
fromwriteStart date, for example 2026-05-01.
header_toolreadCarries an x-mcp-header parameter.
json_schema_2020_12_toolreadTool with JSON Schema 2020-12 features
membershipreadjoined, notJoined, or all.
needs_samplingreadRequires the sampling client capability.
progress_toolreadReports progress.
qbr-prep-packread
regionreadAwin region code, default GB.
relationshipreadjoined, pending, notjoined, or any.
searchreadOptional merchant/category search term.
statusreadpending, approved, reversed, paid, or other.
test_audio_contentreadConformance fixture: returns an audio content block.
test_custom_headersreadConformance fixture: echoes a parameter that rides in the Mcp-Param-custom-data header.
test_embedded_resourcereadConformance fixture: returns an embedded resource content block.
test_error_handlingreadConformance fixture: always returns a tool-level error result.
test_image_contentreadConformance fixture: returns an image content block.
test_logging_toolreadConformance fixture: performs work without emitting log notifications.
test_missing_capabilityreadConformance fixture: requires the sampling client capability.
test_multiple_content_typesreadConformance fixture: returns text and image content together.
test_prompt_with_argumentsreadConformance fixture: substitutes arg1 and arg2 into the message.
test_prompt_with_embedded_resourcereadConformance fixture: embeds the resource named by resourceUri.
test_prompt_with_imagereadConformance fixture: a prompt carrying an image content block.
test_simple_promptreadConformance fixture: a one-message prompt.
test_simple_textreadConformance fixture: returns a plain text result.
test_streaming_elicitationreadConformance fixture: completes in one round trip without server-initiated requests.
test_tool_with_progressreadConformance fixture: reports progress 0/50/100 when a progressToken is provided.
test_trigger_tool_changewriteConformance fixture: acknowledges a tool-change trigger (no-op).
toreadEnd date, for example 2026-05-22.
transactionIdsreadComma-separated transaction IDs.
typereadpromotion, voucher, or all.
vertical-benchmark-packread

Details

Source
bobberrisford/affiliatemcp
npm
affiliate-mcp-waitlist@0.1.0
Transports
stdio · streamable-http
Credentials it reads
HOSTED_AUTH_URL
License
MIT
Stars
6 · pushed 32d ago

Trust audit

Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (8 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.claude/skills/contribute/SKILL.md:112
Credentials are read via `requireCredential` from `src/shared/config.ts`. Never
Why it matters. asks the agent to read credentials
HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.claude/skills/contribute/SKILL.md:113
read `process.env` directly inside an adapter — missing values must surface as
Why it matters. asks the agent to read credentials
MEDIUMInventory / provenance · inv.binary · CWE-1104
desktop/build/icon.icns
icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.agents/skills/delivery-steward
.agents/skills/delivery-steward
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.agents/skills/prepare-for-review
.agents/skills/prepare-for-review
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.agents/skills/review-pr
.agents/skills/review-pr
Why it matters. link not followed
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/conformance-hosted.ts:151
authUrl: `http://127.0.0.1:${worker.port}`,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/conformance-hosted.ts:152
vaultUrl: `http://127.0.0.1:${worker.port}`,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/conformance-hosted.ts:162
const baseArgs = ['server', '--url', `http://127.0.0.1:${proxy.port}/mcp`, '--spec-version', '2026-07-28'];
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
hosted/test/account-routes.test.ts:186
const secret = 'AWIN-TOKEN-2f9c-do-not-leak';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
hosted/test/oauth.test.ts:553
formPost('/authorize/consent', { auth_req: reqId, token: 'amcps_not_a_real_token', decision: 'approve' }),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
hosted/test/vault.test.ts:84
await putCredentials(kv, provider, 'hosted_usr_a', 'awin', { apiKey: 'sekret-plaintext-marker' });
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/networks/shareasale/client.ts:36
*   secret = "ATj7vd8b7CCjeq9yQUo8cc2w3OThqe2e"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/hosted-digest/server.test.ts:181
const token = 'amcps_digest.token.e2e';
LOWInventory / provenance · inv.hidden_file · CWE-1104
.eslintrc.cjs
.eslintrc.cjs
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
desktop/renderer/app.js:7
const MARK = '../../design-system/assets/mark.svg';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/wizard/brand-discovery.ts:32
import { isValidBrandSlug, registerBrand, suggestSlug } from '../../shared/brands.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/wizard/brand-discovery.ts:33
import { assertMultiBrandAdapter } from '../../shared/brand-resolver.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/wizard/brand-discovery.ts:34
import { NotImplementedError } from '../../shared/errors.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/wizard/brand-discovery.ts:35
import type { DiscoveredBrand, NetworkAdapter } from '../../shared/types.js';
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
.github/workflows/deploy-pages.yml:33
# The beacon ships as a placeholder so the repo never carries an
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
.github/workflows/deploy-pages.yml:35
# set, substitute it; if it is not, strip the beacon entirely rather than
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
.github/workflows/deploy-pages.yml:39
- name: Inject or strip the analytics beacon
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/product/chatgpt-scoping.md:41
`cloudflared tunnel --url http://127.0.0.1:<port>`, captures the
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
hosted/test/oauth.test.ts:222
const res = await worker.fetch(jsonPost('/register', { redirect_uris: ['http://127.0.0.1:8976/callback'] }), env);

Gates applied: no_behavioural_pass.

Audited 2026-09-13 · audit v0.4.0 · source sha b3a1a386917b · full audit: observations/trust-audit/mcp-server/bobberrisford__affiliate-networks-mcp.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-13b3a1a386917bBLOCKF39first audit

Also audited

Servers with a similar trust profile.

Questions

What is the Affiliate Networks MCP MCP server?

affiliate network MCPs and skills

What tools does Affiliate Networks MCP expose?

57 in total: 51 read-only, 6 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Affiliate Networks MCP safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (39/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Affiliate Networks MCP need?

It reads HOSTED_AUTH_URL from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Affiliate Networks MCP run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as affiliate-mcp-waitlist at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (b3a1a386917b), read on 2026-09-13. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-13 · job trust-audit-2026-09-13