audigeo-mcp 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. audigeo_mcp-0.1.2/.gitignore +11 -0
  2. audigeo_mcp-0.1.2/PKG-INFO +167 -0
  3. audigeo_mcp-0.1.2/README.md +147 -0
  4. audigeo_mcp-0.1.2/build/build_mcpb.sh +70 -0
  5. audigeo_mcp-0.1.2/build/build_plugin.sh +55 -0
  6. audigeo_mcp-0.1.2/build/build_wheel.sh +24 -0
  7. audigeo_mcp-0.1.2/claude_code_plugin/.claude-plugin/plugin.json +13 -0
  8. audigeo_mcp-0.1.2/claude_code_plugin/.mcp.json +11 -0
  9. audigeo_mcp-0.1.2/claude_code_plugin/README.md +64 -0
  10. audigeo_mcp-0.1.2/claude_code_plugin/agents/audigeo-strategist.md +50 -0
  11. audigeo_mcp-0.1.2/claude_code_plugin/commands/audigeo-audit.md +19 -0
  12. audigeo_mcp-0.1.2/claude_code_plugin/commands/audigeo-content.md +26 -0
  13. audigeo_mcp-0.1.2/claude_code_plugin/commands/audigeo-monitor.md +22 -0
  14. audigeo_mcp-0.1.2/claude_code_plugin/commands/audigeo-status.md +21 -0
  15. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-audit/SKILL.md +55 -0
  16. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-bot-analytics/SKILL.md +56 -0
  17. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-brand-profile/SKILL.md +64 -0
  18. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-content-gen/SKILL.md +57 -0
  19. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-hallucination-triage/SKILL.md +56 -0
  20. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-monitoring/SKILL.md +62 -0
  21. audigeo_mcp-0.1.2/claude_code_plugin/skills/audigeo-overview/SKILL.md +50 -0
  22. audigeo_mcp-0.1.2/mcpb/README.md +57 -0
  23. audigeo_mcp-0.1.2/mcpb/icon.png +0 -0
  24. audigeo_mcp-0.1.2/mcpb/manifest.json +105 -0
  25. audigeo_mcp-0.1.2/mcpb/server/bootstrap.py +151 -0
  26. audigeo_mcp-0.1.2/pyproject.toml +46 -0
  27. audigeo_mcp-0.1.2/src/audigeo_mcp/__init__.py +8 -0
  28. audigeo_mcp-0.1.2/src/audigeo_mcp/__main__.py +13 -0
  29. audigeo_mcp-0.1.2/src/audigeo_mcp/client.py +194 -0
  30. audigeo_mcp-0.1.2/src/audigeo_mcp/config.py +62 -0
  31. audigeo_mcp-0.1.2/src/audigeo_mcp/context.py +37 -0
  32. audigeo_mcp-0.1.2/src/audigeo_mcp/prompts/__init__.py +8 -0
  33. audigeo_mcp-0.1.2/src/audigeo_mcp/prompts/audigeo_prompts.py +200 -0
  34. audigeo_mcp-0.1.2/src/audigeo_mcp/resources/__init__.py +8 -0
  35. audigeo_mcp-0.1.2/src/audigeo_mcp/resources/audit.py +89 -0
  36. audigeo_mcp-0.1.2/src/audigeo_mcp/resources/monitoring.py +57 -0
  37. audigeo_mcp-0.1.2/src/audigeo_mcp/resources/report.py +56 -0
  38. audigeo_mcp-0.1.2/src/audigeo_mcp/server.py +115 -0
  39. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/__init__.py +6 -0
  40. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/alerts.py +31 -0
  41. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/audit.py +87 -0
  42. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/brand_profile.py +57 -0
  43. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/content.py +106 -0
  44. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/hallucinations.py +40 -0
  45. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/monitoring.py +98 -0
  46. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/sites.py +44 -0
  47. audigeo_mcp-0.1.2/src/audigeo_mcp/tools/workflows.py +160 -0
  48. audigeo_mcp-0.1.2/tests/__init__.py +0 -0
  49. audigeo_mcp-0.1.2/tests/conftest.py +43 -0
  50. audigeo_mcp-0.1.2/tests/test_client.py +139 -0
  51. audigeo_mcp-0.1.2/tests/test_config.py +56 -0
  52. audigeo_mcp-0.1.2/tests/test_context.py +40 -0
  53. audigeo_mcp-0.1.2/tests/test_resources.py +69 -0
  54. audigeo_mcp-0.1.2/tests/test_workflows.py +126 -0
  55. audigeo_mcp-0.1.2/uv.lock +1208 -0
@@ -0,0 +1,11 @@
1
+ # Build artifacts — produced by mcp/build/*.sh, recreated by CI
2
+ dist/
3
+ *.egg-info/
4
+ __pycache__/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ .mypy_cache/
8
+ .venv/
9
+
10
+ # Editor scratch
11
+ .DS_Store
@@ -0,0 +1,167 @@
1
+ Metadata-Version: 2.4
2
+ Name: audigeo-mcp
3
+ Version: 0.1.2
4
+ Summary: AudiGEO MCP server — exposes AudiGEO.ai capabilities (audits, monitoring, hallucinations, content) to MCP-compatible agents.
5
+ Author-email: Sponge Theory <support@audigeo.ai>
6
+ License: SPONGE THEORY PROPRIETARY LICENSE
7
+ Keywords: ai-monitoring,audigeo,claude,geo,mcp,sponge-theory
8
+ Requires-Python: >=3.10
9
+ Requires-Dist: httpx<1,>=0.27
10
+ Requires-Dist: mcp[cli]>=1.2.0
11
+ Requires-Dist: pydantic-settings<3,>=2.2
12
+ Requires-Dist: pydantic<3,>=2.6
13
+ Provides-Extra: dev
14
+ Requires-Dist: mypy>=1.10; extra == 'dev'
15
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
16
+ Requires-Dist: pytest-httpx>=0.30; extra == 'dev'
17
+ Requires-Dist: pytest>=8; extra == 'dev'
18
+ Requires-Dist: ruff>=0.5; extra == 'dev'
19
+ Description-Content-Type: text/markdown
20
+
21
+ # audigeo-mcp
22
+
23
+ MCP server exposing the **AudiGEO.ai** GEO platform to MCP-compatible agents
24
+ (Claude Code, Claude Desktop, and any other MCP host).
25
+
26
+ Talks to the existing AudiGEO REST API at `https://audigeo.ai/api/v1` using
27
+ an organization-level API key sent as `Authorization: Bearer <key>`. Requires
28
+ plan **Pro** or **Agency**.
29
+
30
+ ---
31
+
32
+ ## What's exposed (v0.1.1)
33
+
34
+ **26 tools** across 8 modules, **3 resources**, and **3 prompt templates**.
35
+ All tool names are prefixed `audigeo_` so they don't collide with tools from
36
+ other MCP servers a host might have mounted.
37
+
38
+ | Module | Tool | Type |
39
+ |---|---|---|
40
+ | `sites` | `audigeo_list_sites` | read |
41
+ | | `audigeo_get_site` | read |
42
+ | | `audigeo_create_site` | write |
43
+ | `audit` | `audigeo_list_audits` | read |
44
+ | | `audigeo_get_audit` | read (composite) |
45
+ | | `audigeo_list_recommendations` | read |
46
+ | | `audigeo_launch_audit` | write |
47
+ | `brand_profile` | `audigeo_get_brand_profile` | read |
48
+ | | `audigeo_update_brand_profile` | write |
49
+ | `monitoring` | `audigeo_get_monitoring_kpis` | read |
50
+ | | `audigeo_get_monitoring_results` | read |
51
+ | | `audigeo_get_competitors_analysis` | read |
52
+ | | `audigeo_get_citations_gap` | read |
53
+ | | `audigeo_run_monitoring_now` | write |
54
+ | `hallucinations` | `audigeo_list_hallucinations` | read |
55
+ | | `audigeo_get_hallucination_stats` | read |
56
+ | `content` | `audigeo_list_content` | read |
57
+ | | `audigeo_get_content` | read |
58
+ | | `audigeo_generate_content` | write |
59
+ | | `audigeo_generate_markdown_mirror` | write |
60
+ | `alerts` | `audigeo_list_alerts` | read |
61
+ | | `audigeo_mark_alert_read` | write |
62
+ | `workflows` | `audigeo_audit_executive_summary` | composite |
63
+ | | `audigeo_brand_safety_check` | composite |
64
+ | | `audigeo_competitive_analysis` | composite |
65
+ | | `audigeo_geo_action_plan` | composite |
66
+
67
+ **Resources** (URI-addressable, read-only): `audigeo://audits/{audit_id}`,
68
+ `audigeo://monitoring/results/{site_id}`, `audigeo://reports/{report_id}`.
69
+
70
+ **Prompts**: `geo_audit_briefing`, `monitoring_weekly_recap`,
71
+ `hallucination_response_draft` — all fr/en/es.
72
+
73
+ Set `AUDIGEO_READ_ONLY=true` to disable every write tool at startup.
74
+
75
+ ---
76
+
77
+ ## Configuration
78
+
79
+ | Env var | Required | Default | Purpose |
80
+ |---|---|---|---|
81
+ | `AUDIGEO_API_KEY` | yes | — | Your AudiGEO API key (`agk_...`). Generate at https://audigeo.ai → Settings → API Keys. |
82
+ | `AUDIGEO_API_URL` | no | `https://audigeo.ai/api/v1` | Override for staging / self-hosted. |
83
+ | `AUDIGEO_READ_ONLY` | no | `false` | Disable write tools. |
84
+ | `AUDIGEO_DEFAULT_SITE_ID` | no | — | UUID used when an agent omits `site_id`. |
85
+ | `AUDIGEO_TIMEOUT_S` | no | `60` | Per-request timeout. |
86
+ | `AUDIGEO_LOG_LEVEL` | no | `INFO` | DEBUG / INFO / WARNING / ERROR / CRITICAL. |
87
+
88
+ ---
89
+
90
+ ## Use from Claude Desktop
91
+
92
+ Install the AudiGEO `.mcpb` bundle (downloadable from Settings → Intégrations
93
+ Claude on audigeo.ai). Claude Desktop will prompt for your API key on
94
+ install — no manual config, no Python prerequisite (the bundle provisions its
95
+ own environment on first launch).
96
+
97
+ ## Use from Claude Code
98
+
99
+ Two ways to install, from most to least automated:
100
+
101
+ **Via the Sponge Theory marketplace:**
102
+
103
+ ```
104
+ /plugin marketplace add ezeeFlop/audigeo
105
+ /plugin install audigeo@sponge-theory
106
+ ```
107
+
108
+ **Manually**, from the downloaded `audigeo-claude-code-<version>.tar.gz`
109
+ (Settings → Intégrations Claude on audigeo.ai):
110
+
111
+ ```bash
112
+ mkdir -p ~/.claude/plugins
113
+ tar -xzf audigeo-claude-code-*.tar.gz -C ~/.claude/plugins/
114
+ ```
115
+
116
+ Either way, the plugin's `.mcp.json` launches the server via
117
+ `uv tool run --from <plugin>/server audigeo-mcp` — **`uv` must be installed**
118
+ (https://docs.astral.sh/uv/getting-started/installation/), but no `pip
119
+ install` of `audigeo-mcp` is needed: `uv` builds and caches an isolated
120
+ environment from the bundled source on first launch.
121
+
122
+ Set your key once, then restart Claude Code:
123
+
124
+ ```bash
125
+ export AUDIGEO_API_KEY=agk_...
126
+ ```
127
+
128
+ ## Use from any other MCP host
129
+
130
+ The server speaks MCP over stdio. Point your host at:
131
+
132
+ ```bash
133
+ AUDIGEO_API_KEY=agk_... audigeo-mcp
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Development
139
+
140
+ ```bash
141
+ cd mcp
142
+ uv pip install -e ".[dev]"
143
+ pytest -q
144
+ ruff check .
145
+ ```
146
+
147
+ Smoke test against a local AudiGEO dev server:
148
+
149
+ ```bash
150
+ export AUDIGEO_API_KEY=agk_test_$(openssl rand -hex 8)
151
+ export AUDIGEO_API_URL=http://localhost:8000/api/v1
152
+ audigeo-mcp # then send MCP frames over stdin
153
+ ```
154
+
155
+ Build all three distributable artifacts (wheel, .mcpb, Claude Code plugin):
156
+
157
+ ```bash
158
+ ./build/build_wheel.sh
159
+ ./build/build_mcpb.sh
160
+ ./build/build_plugin.sh
161
+ ```
162
+
163
+ ---
164
+
165
+ ## License
166
+
167
+ Sponge Theory proprietary. Distribution restricted to AudiGEO subscribers.
@@ -0,0 +1,147 @@
1
+ # audigeo-mcp
2
+
3
+ MCP server exposing the **AudiGEO.ai** GEO platform to MCP-compatible agents
4
+ (Claude Code, Claude Desktop, and any other MCP host).
5
+
6
+ Talks to the existing AudiGEO REST API at `https://audigeo.ai/api/v1` using
7
+ an organization-level API key sent as `Authorization: Bearer <key>`. Requires
8
+ plan **Pro** or **Agency**.
9
+
10
+ ---
11
+
12
+ ## What's exposed (v0.1.1)
13
+
14
+ **26 tools** across 8 modules, **3 resources**, and **3 prompt templates**.
15
+ All tool names are prefixed `audigeo_` so they don't collide with tools from
16
+ other MCP servers a host might have mounted.
17
+
18
+ | Module | Tool | Type |
19
+ |---|---|---|
20
+ | `sites` | `audigeo_list_sites` | read |
21
+ | | `audigeo_get_site` | read |
22
+ | | `audigeo_create_site` | write |
23
+ | `audit` | `audigeo_list_audits` | read |
24
+ | | `audigeo_get_audit` | read (composite) |
25
+ | | `audigeo_list_recommendations` | read |
26
+ | | `audigeo_launch_audit` | write |
27
+ | `brand_profile` | `audigeo_get_brand_profile` | read |
28
+ | | `audigeo_update_brand_profile` | write |
29
+ | `monitoring` | `audigeo_get_monitoring_kpis` | read |
30
+ | | `audigeo_get_monitoring_results` | read |
31
+ | | `audigeo_get_competitors_analysis` | read |
32
+ | | `audigeo_get_citations_gap` | read |
33
+ | | `audigeo_run_monitoring_now` | write |
34
+ | `hallucinations` | `audigeo_list_hallucinations` | read |
35
+ | | `audigeo_get_hallucination_stats` | read |
36
+ | `content` | `audigeo_list_content` | read |
37
+ | | `audigeo_get_content` | read |
38
+ | | `audigeo_generate_content` | write |
39
+ | | `audigeo_generate_markdown_mirror` | write |
40
+ | `alerts` | `audigeo_list_alerts` | read |
41
+ | | `audigeo_mark_alert_read` | write |
42
+ | `workflows` | `audigeo_audit_executive_summary` | composite |
43
+ | | `audigeo_brand_safety_check` | composite |
44
+ | | `audigeo_competitive_analysis` | composite |
45
+ | | `audigeo_geo_action_plan` | composite |
46
+
47
+ **Resources** (URI-addressable, read-only): `audigeo://audits/{audit_id}`,
48
+ `audigeo://monitoring/results/{site_id}`, `audigeo://reports/{report_id}`.
49
+
50
+ **Prompts**: `geo_audit_briefing`, `monitoring_weekly_recap`,
51
+ `hallucination_response_draft` — all fr/en/es.
52
+
53
+ Set `AUDIGEO_READ_ONLY=true` to disable every write tool at startup.
54
+
55
+ ---
56
+
57
+ ## Configuration
58
+
59
+ | Env var | Required | Default | Purpose |
60
+ |---|---|---|---|
61
+ | `AUDIGEO_API_KEY` | yes | — | Your AudiGEO API key (`agk_...`). Generate at https://audigeo.ai → Settings → API Keys. |
62
+ | `AUDIGEO_API_URL` | no | `https://audigeo.ai/api/v1` | Override for staging / self-hosted. |
63
+ | `AUDIGEO_READ_ONLY` | no | `false` | Disable write tools. |
64
+ | `AUDIGEO_DEFAULT_SITE_ID` | no | — | UUID used when an agent omits `site_id`. |
65
+ | `AUDIGEO_TIMEOUT_S` | no | `60` | Per-request timeout. |
66
+ | `AUDIGEO_LOG_LEVEL` | no | `INFO` | DEBUG / INFO / WARNING / ERROR / CRITICAL. |
67
+
68
+ ---
69
+
70
+ ## Use from Claude Desktop
71
+
72
+ Install the AudiGEO `.mcpb` bundle (downloadable from Settings → Intégrations
73
+ Claude on audigeo.ai). Claude Desktop will prompt for your API key on
74
+ install — no manual config, no Python prerequisite (the bundle provisions its
75
+ own environment on first launch).
76
+
77
+ ## Use from Claude Code
78
+
79
+ Two ways to install, from most to least automated:
80
+
81
+ **Via the Sponge Theory marketplace:**
82
+
83
+ ```
84
+ /plugin marketplace add ezeeFlop/audigeo
85
+ /plugin install audigeo@sponge-theory
86
+ ```
87
+
88
+ **Manually**, from the downloaded `audigeo-claude-code-<version>.tar.gz`
89
+ (Settings → Intégrations Claude on audigeo.ai):
90
+
91
+ ```bash
92
+ mkdir -p ~/.claude/plugins
93
+ tar -xzf audigeo-claude-code-*.tar.gz -C ~/.claude/plugins/
94
+ ```
95
+
96
+ Either way, the plugin's `.mcp.json` launches the server via
97
+ `uv tool run --from <plugin>/server audigeo-mcp` — **`uv` must be installed**
98
+ (https://docs.astral.sh/uv/getting-started/installation/), but no `pip
99
+ install` of `audigeo-mcp` is needed: `uv` builds and caches an isolated
100
+ environment from the bundled source on first launch.
101
+
102
+ Set your key once, then restart Claude Code:
103
+
104
+ ```bash
105
+ export AUDIGEO_API_KEY=agk_...
106
+ ```
107
+
108
+ ## Use from any other MCP host
109
+
110
+ The server speaks MCP over stdio. Point your host at:
111
+
112
+ ```bash
113
+ AUDIGEO_API_KEY=agk_... audigeo-mcp
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Development
119
+
120
+ ```bash
121
+ cd mcp
122
+ uv pip install -e ".[dev]"
123
+ pytest -q
124
+ ruff check .
125
+ ```
126
+
127
+ Smoke test against a local AudiGEO dev server:
128
+
129
+ ```bash
130
+ export AUDIGEO_API_KEY=agk_test_$(openssl rand -hex 8)
131
+ export AUDIGEO_API_URL=http://localhost:8000/api/v1
132
+ audigeo-mcp # then send MCP frames over stdin
133
+ ```
134
+
135
+ Build all three distributable artifacts (wheel, .mcpb, Claude Code plugin):
136
+
137
+ ```bash
138
+ ./build/build_wheel.sh
139
+ ./build/build_mcpb.sh
140
+ ./build/build_plugin.sh
141
+ ```
142
+
143
+ ---
144
+
145
+ ## License
146
+
147
+ Sponge Theory proprietary. Distribution restricted to AudiGEO subscribers.
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env bash
2
+ # Build the Claude Desktop MCPB bundle from mcp/mcpb/.
3
+ # Output: mcp/dist/audigeo-<VERSION>.mcpb (zip file with renamed extension)
4
+ #
5
+ # Usage: ./build_mcpb.sh
6
+
7
+ set -euo pipefail
8
+
9
+ MCP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
+ cd "$MCP_DIR"
11
+
12
+ VERSION=$(grep -E "^version" pyproject.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
13
+ if [ -z "$VERSION" ]; then
14
+ echo "ERROR: cannot parse version from pyproject.toml" >&2
15
+ exit 1
16
+ fi
17
+
18
+ mkdir -p dist
19
+ OUT="${MCP_DIR}/dist/audigeo-${VERSION}.mcpb"
20
+
21
+ if [ ! -d "mcpb" ]; then
22
+ echo "ERROR: mcpb/ template missing" >&2
23
+ exit 1
24
+ fi
25
+
26
+ STAGE=$(mktemp -d)
27
+ trap 'rm -rf "$STAGE"' EXIT
28
+
29
+ cp -R mcpb/* "$STAGE/"
30
+
31
+ # Embed the server source so the bundle is self-contained
32
+ mkdir -p "$STAGE/server"
33
+ cp -R src "$STAGE/server/src"
34
+ cp pyproject.toml "$STAGE/server/pyproject.toml"
35
+ cp README.md "$STAGE/server/README.md"
36
+
37
+ # Bundle the wheel so bootstrap.py can provision dependencies on the user's
38
+ # machine at first run (pip resolves the correct per-platform binaries —
39
+ # vendoring compiled deps like pydantic-core into one cross-platform bundle is
40
+ # not possible). Build the wheel first if it isn't in dist/ yet.
41
+ mkdir -p "$STAGE/server/wheels"
42
+ WHEEL=$(ls -t dist/audigeo_mcp-*.whl 2>/dev/null | head -1 || true)
43
+ if [ -z "${WHEEL:-}" ]; then
44
+ echo "No wheel in dist/ — building it first…"
45
+ "$(dirname "$0")/build_wheel.sh" >/dev/null
46
+ WHEEL=$(ls -t dist/audigeo_mcp-*.whl 2>/dev/null | head -1 || true)
47
+ fi
48
+ if [ -z "${WHEEL:-}" ]; then
49
+ echo "ERROR: could not build/find the audigeo_mcp wheel" >&2
50
+ exit 1
51
+ fi
52
+ cp "$WHEEL" "$STAGE/server/wheels/"
53
+ echo "Bundled wheel: $(basename "$WHEEL")"
54
+
55
+ # Inject version into manifest.json
56
+ MANIFEST="$STAGE/manifest.json"
57
+ if [ -f "$MANIFEST" ]; then
58
+ /usr/bin/sed -i.bak -E "s/\"version\": *\"[^\"]+\"/\"version\": \"${VERSION}\"/" "$MANIFEST"
59
+ rm -f "${MANIFEST}.bak"
60
+ fi
61
+
62
+ # Strip macOS metadata
63
+ find "$STAGE" -name '.DS_Store' -delete 2>/dev/null || true
64
+ find "$STAGE" -name '__pycache__' -type d -exec rm -rf {} + 2>/dev/null || true
65
+
66
+ # .mcpb is just a zip
67
+ rm -f "$OUT"
68
+ (cd "$STAGE" && zip -qr "$OUT" .)
69
+
70
+ echo "Built: $OUT ($(du -h "$OUT" | awk '{print $1}'))"
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bash
2
+ # Build the Claude Code plugin tar.gz from mcp/claude_code_plugin/.
3
+ # Output: mcp/dist/audigeo-claude-code-<VERSION>.tar.gz
4
+ #
5
+ # Usage: ./build_plugin.sh
6
+
7
+ set -euo pipefail
8
+
9
+ MCP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
+ cd "$MCP_DIR"
11
+
12
+ # Read version from pyproject.toml
13
+ VERSION=$(grep -E "^version" pyproject.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
14
+ if [ -z "$VERSION" ]; then
15
+ echo "ERROR: cannot parse version from pyproject.toml" >&2
16
+ exit 1
17
+ fi
18
+
19
+ mkdir -p dist
20
+ OUT="dist/audigeo-claude-code-${VERSION}.tar.gz"
21
+
22
+ if [ ! -d "claude_code_plugin" ]; then
23
+ echo "ERROR: claude_code_plugin/ template missing" >&2
24
+ exit 1
25
+ fi
26
+
27
+ # Stage to a temp dir so the tarball has a clean top-level directory
28
+ STAGE=$(mktemp -d)
29
+ trap 'rm -rf "$STAGE"' EXIT
30
+ cp -R claude_code_plugin "${STAGE}/audigeo"
31
+
32
+ # Inject version into .claude-plugin/plugin.json
33
+ PLUGIN_JSON="${STAGE}/audigeo/.claude-plugin/plugin.json"
34
+ if [ -f "$PLUGIN_JSON" ]; then
35
+ /usr/bin/sed -i.bak -E "s/\"version\": *\"[^\"]+\"/\"version\": \"${VERSION}\"/" "$PLUGIN_JSON"
36
+ rm -f "${PLUGIN_JSON}.bak"
37
+ fi
38
+
39
+ # Bundle the MCP server SOURCE (not a wheel) under server/, so .mcp.json's
40
+ # `uv tool run --from ${CLAUDE_PLUGIN_ROOT}/server audigeo-mcp` can build and
41
+ # run it with no PyPI publish and no pre-existing venv on the user's machine —
42
+ # uv resolves the interpreter, builds an isolated env, and caches it per
43
+ # server/ content hash. Mirrors what build_mcpb.sh does for the .mcpb bundle.
44
+ SERVER_DIR="${STAGE}/audigeo/server"
45
+ mkdir -p "$SERVER_DIR"
46
+ cp -R src "$SERVER_DIR/src"
47
+ cp pyproject.toml "$SERVER_DIR/pyproject.toml"
48
+ cp README.md "$SERVER_DIR/README.md"
49
+
50
+ # Strip macOS metadata and caches
51
+ find "$STAGE" -name '.DS_Store' -delete 2>/dev/null || true
52
+ find "$STAGE" -name '__pycache__' -type d -exec rm -rf {} + 2>/dev/null || true
53
+
54
+ tar -czf "$OUT" -C "$STAGE" audigeo
55
+ echo "Built: $OUT ($(du -h "$OUT" | awk '{print $1}'))"
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bash
2
+ # Build the audigeo-mcp Python wheel.
3
+ # Output: mcp/dist/audigeo_mcp-<VERSION>-py3-none-any.whl + .tar.gz
4
+ #
5
+ # Usage: ./build_wheel.sh
6
+
7
+ set -euo pipefail
8
+
9
+ MCP_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
+ cd "$MCP_DIR"
11
+
12
+ # Don't rm dist/ — other build scripts have already populated it
13
+ rm -f dist/audigeo_mcp-*.whl dist/audigeo_mcp-*.tar.gz 2>/dev/null || true
14
+
15
+ # Prefer uv (already used in the project), fall back to python -m build
16
+ if command -v uv >/dev/null 2>&1; then
17
+ uv build --wheel --sdist --out-dir dist 2>&1 | tail -5
18
+ else
19
+ "${PYTHON:-python}" -m build --wheel --sdist --outdir dist . 2>&1 | tail -5
20
+ fi
21
+
22
+ echo ""
23
+ echo "Built artifacts:"
24
+ ls -lh dist/audigeo_mcp-*.whl dist/audigeo_mcp-*.tar.gz 2>/dev/null
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "audigeo",
3
+ "version": "0.1.2",
4
+ "description": "AudiGEO.ai — audit GEO, monitoring IA, hallucinations, génération de contenu, depuis Claude Code.",
5
+ "author": {
6
+ "name": "Sponge Theory",
7
+ "email": "support@audigeo.ai",
8
+ "url": "https://audigeo.ai"
9
+ },
10
+ "homepage": "https://audigeo.ai",
11
+ "license": "Sponge Theory Proprietary",
12
+ "keywords": ["geo", "seo", "ai-monitoring", "audigeo", "sponge-theory"]
13
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "audigeo": {
4
+ "command": "uv",
5
+ "args": ["tool", "run", "--from", "${CLAUDE_PLUGIN_ROOT}/server", "audigeo-mcp"],
6
+ "env": {
7
+ "AUDIGEO_API_KEY": "${AUDIGEO_API_KEY}"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,64 @@
1
+ # AudiGEO Claude Code plugin
2
+
3
+ GEO audits, AI-platform monitoring, hallucination detection, and content
4
+ generation, accessible directly inside Claude Code.
5
+
6
+ ## Install
7
+
8
+ **Via the Sponge Theory marketplace (recommended):**
9
+
10
+ ```
11
+ /plugin marketplace add ezeeFlop/audigeo
12
+ /plugin install audigeo@sponge-theory
13
+ ```
14
+
15
+ **Manually**, from the downloaded `audigeo-claude-code-<version>.tar.gz`
16
+ (https://audigeo.ai → Settings → Intégrations Claude):
17
+
18
+ ```bash
19
+ mkdir -p ~/.claude/plugins
20
+ tar -xzf audigeo-claude-code-*.tar.gz -C ~/.claude/plugins/
21
+ ```
22
+
23
+ Either way, the bundled `.mcp.json` launches the MCP server via
24
+ `uv tool run --from <plugin>/server audigeo-mcp` — **you need `uv` installed**
25
+ (https://docs.astral.sh/uv/getting-started/installation/). No `pip install`
26
+ needed: `uv` builds and caches an isolated environment from the bundled
27
+ server source on first launch.
28
+
29
+ ## Configure
30
+
31
+ Set your API key (generate at https://audigeo.ai → Settings → API Keys,
32
+ requires plan Pro or Agency) in your shell environment before starting Claude
33
+ Code:
34
+
35
+ ```bash
36
+ export AUDIGEO_API_KEY=agk_...
37
+ ```
38
+
39
+ Restart Claude Code. Try `/audigeo-status` to verify.
40
+
41
+ ## What's included
42
+
43
+ - **MCP server**: 26 tools, 3 resources, 3 prompt templates (see
44
+ https://audigeo.ai/docs/mcp for the complete list).
45
+ - **7 skills**: contextual guidance the agent loads on demand (audit,
46
+ monitoring, hallucination triage, brand profile, content generation, bot
47
+ analytics, product overview).
48
+ - **4 slash commands**: `/audigeo-status`, `/audigeo-audit`,
49
+ `/audigeo-monitor`, `/audigeo-content`.
50
+ - **Subagent `audigeo-strategist`**: an in-house GEO expert agent with the
51
+ full toolkit at its disposal.
52
+
53
+ ## Configuration
54
+
55
+ | Env var | Default | Purpose |
56
+ |---|---|---|
57
+ | `AUDIGEO_API_KEY` | — (required) | Your AudiGEO API key (`agk_...`). |
58
+ | `AUDIGEO_API_URL` | `https://audigeo.ai/api/v1` | Override for staging/self-hosted — export it in your shell if you need a non-default value. |
59
+ | `AUDIGEO_READ_ONLY` | `false` | When `true`, disables every write tool. |
60
+ | `AUDIGEO_DEFAULT_SITE_ID` | — | UUID used when an agent omits `site_id`. |
61
+
62
+ ## License
63
+
64
+ Sponge Theory proprietary. Distribution restricted to AudiGEO subscribers.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: audigeo-strategist
3
+ description: Use proactively for any question that needs a holistic GEO strategy across audit + monitoring + content + hallucinations — when the user asks "what should I do overall about my AI visibility", "give me a quarterly plan", "audit my whole AudiGEO setup", or wants a senior GEO consultant's POV. This subagent runs deeper analyses than a single tool call would.
4
+ tools: ["mcp__audigeo__*"]
5
+ ---
6
+
7
+ Tu es un consultant senior en Generative Engine Optimization, déployé en tant que sub-agent dans Claude Code. Tu as accès à tous les outils MCP `audigeo_*` du serveur AudiGEO de l'utilisateur (audits, monitoring, hallucinations, contenu, brand profile, alerts, workflows composites).
8
+
9
+ ## Mission
10
+
11
+ Quand on t'invoque, l'utilisateur cherche une vue d'ensemble stratégique, pas une réponse ponctuelle à un outil. Ton job est de :
12
+
13
+ 1. **Diagnostiquer** : collecter l'état actuel sur les 4 axes (audit, monitoring, hallucinations, contenu) via plusieurs outils.
14
+ 2. **Synthétiser** : repérer les patterns transverses (ex: "audit faible sur Schema.org + monitoring faible sur Gemini = besoin de structurer la donnée").
15
+ 3. **Prioriser** : donner un plan d'action sur 3 horizons (cette semaine, ce mois, ce trimestre).
16
+
17
+ ## Méthode
18
+
19
+ À chaque invocation, exécute ce flow :
20
+
21
+ 1. `audigeo_list_sites` — quels sites sont configurés
22
+ 2. Pour le site principal : `audigeo_list_audits(site_id, limit=1)` puis `audigeo_get_audit(latest_audit_id)`
23
+ 3. `audigeo_get_monitoring_kpis(site_id, days=30)`
24
+ 4. `audigeo_competitive_analysis(site_id, days=30)`
25
+ 5. `audigeo_get_citations_gap(site_id)`
26
+ 6. `audigeo_brand_safety_check(days=14)`
27
+ 7. `audigeo_get_brand_profile`
28
+ 8. `audigeo_list_alerts(unread_only=True)` — pour voir s'il y a des alertes ouvertes critiques
29
+
30
+ ## Format de sortie
31
+
32
+ Markdown structuré en français :
33
+
34
+ - **Synthèse** (2-3 paragraphes) : le diagnostic global, en langage business.
35
+ - **Forces actuelles** : ce qui marche déjà, à conserver.
36
+ - **Faiblesses prioritaires** : 3-5 zones à corriger, ordonnées par leverage.
37
+ - **Plan d'action 90 jours** :
38
+ - **Semaine 1-2** : 2-3 actions tactiques (quick wins P0 de l'audit + correction des hallucinations critiques).
39
+ - **Mois 1-3** : 4-5 actions structurelles (renforcer Schema.org, déployer Markdown Mirrors, presse/Wikipédia, prompts monitoring élargis).
40
+ - **Trimestre suivant** : 2-3 paris (nouveau contenu majeur, repositionnement Brand Profile, etc.).
41
+ - **KPIs à suivre** : les 3 chiffres à surveiller au prochain check-in (avec valeurs cibles).
42
+
43
+ ## Anti-patterns
44
+
45
+ - **Ne pas** te contenter de relayer le résultat d'un seul outil — ton job est l'analyse transverse.
46
+ - **Ne pas** inventer de chiffres : si une donnée manque, dis "non disponible" et précise quel outil ne l'a pas retournée.
47
+ - **Ne pas** mélanger les niveaux : un audit faible n'est pas la même question qu'un Share of Voice faible. Traite-les séparément.
48
+ - **Ne pas** déclencher d'écriture (audit, génération de contenu, modification du profil) sans confirmation explicite de l'utilisateur principal qui t'a invoqué.
49
+
50
+ Ton ton : expert posé, en français, factuel. Pas de jargon marketing creux. Tu parles à un dirigeant ou un responsable marketing qui doit décider d'investir du temps ou du budget.
@@ -0,0 +1,19 @@
1
+ ---
2
+ description: Lance un audit GEO sur un site et présente le résultat dès qu'il est prêt.
3
+ argument-hint: "<site_id ou URL>"
4
+ ---
5
+
6
+ Tu vas lancer un audit GEO et restituer le résultat. L'utilisateur t'a passé un identifiant de site ou une URL en argument : $ARGUMENTS.
7
+
8
+ 1. Si l'argument ressemble à une URL (commence par `http`), commence par `audigeo_list_sites` et trouve le site correspondant. Si aucun ne match, propose à l'utilisateur de créer le site d'abord (`audigeo_create_site` — demande confirmation avant).
9
+ 2. Sinon, traite l'argument comme un `site_id` UUID.
10
+ 3. Lance l'audit : `audigeo_launch_audit(site_id)`. Récupère l'`audit_id` retourné.
11
+ 4. Indique à l'utilisateur que l'audit est en cours (durée typique 5-15 min).
12
+ 5. **Poll** `audigeo_get_audit(audit_id)` toutes les 60s jusqu'à ce que `status` soit `COMPLETED` ou `FAILED` (max 20 tentatives = 20 min).
13
+ 6. Une fois `COMPLETED` :
14
+ - Présente les 4 scores (global, technique, contenu, autorité) en français.
15
+ - Appelle `audigeo_geo_action_plan(audit_id, max_actions=3)` pour le top 3 des priorités.
16
+ - Présente chaque priorité avec son `title`, `priority`, `impact`, `effort`.
17
+ - Termine par UNE recommandation concrète à attaquer cette semaine.
18
+
19
+ Si le quota plan est atteint (HTTP 402), indique-le et propose l'upgrade Pro/Agency.
@@ -0,0 +1,26 @@
1
+ ---
2
+ description: Génère un contenu GEO optimisé (article / FAQ / llms.txt / Schema.org / etc.) pour un site.
3
+ argument-hint: "<type> <brief>"
4
+ ---
5
+
6
+ Tu vas générer un contenu GEO. L'utilisateur a passé : $ARGUMENTS.
7
+
8
+ Le format attendu est `<type> <brief en texte libre>` où `<type>` est l'un de :
9
+ - `article` — article long, markdown
10
+ - `faq` — FAQ avec balisage FAQPage Schema
11
+ - `llms_txt` — fichier llms.txt racine
12
+ - `llms_full_txt` — version exhaustive
13
+ - `robots_txt` — robots.txt avec User-agents IA
14
+ - `schema_org` — JSON-LD Organization / LocalBusiness / Product
15
+
16
+ Procédure :
17
+
18
+ 1. Parse `$ARGUMENTS` : premier token = `<type>`, reste = `<brief>`.
19
+ 2. Valide que le type est dans la liste autorisée. Sinon, demande à l'utilisateur de préciser.
20
+ 3. Récupère le `site_id` : si l'utilisateur n'a pas précisé via `AUDIGEO_DEFAULT_SITE_ID`, appelle `audigeo_list_sites` et utilise le premier (ou demande).
21
+ 4. Appelle `audigeo_generate_content(content_type=<type>, brief=<brief>, site_id=<site_id>)`.
22
+ 5. La génération est async — tu reçois un `content_id` avec `generation_status="generating"`.
23
+ 6. Poll `audigeo_get_content(content_id)` toutes les 15s jusqu'à `generation_status="generated"` (max 8 tentatives = 2 min).
24
+ 7. Présente le contenu généré à l'utilisateur, formaté pour qu'il puisse le copier directement.
25
+
26
+ Si quota atteint (HTTP 402) : propose l'upgrade Agency. Si génération échoue (HTTP 500 / status `failed`) : montrer le `generation_error` et proposer de relancer.