Gap analysis — GEO & MCP infrastructure
Status: Verified against this repository on 2026-07-30
Scope: Cross-reference of implemented code vs Generative Engine Optimization (GEO) and Model Context Protocol (MCP) requirements from the playbook (../source/JSGlobtech_GEO_Agency_Playbook.pdf), ADRs, and pricing deliverables.
Related: geo-stack.md, ../integrations/mcp-server.md, ../integrations/lead-capture.md, ADR-0001–0005
Executive verdict
JSGlobtech has a credible reference implementation of the two-layer thesis (visibility + action):
| Layer |
Maturity |
| GEO (visibility) |
Strong foundation — llms.txt (dual path), rich Schema.org JSON-LD, entity/location signals, agent discovery hooks |
| MCP (action) |
MVP complete — live Streamable HTTP remote server, one lead tool, OpenAPI mirror, shared Zod → webhook pipeline |
What is not ready is the productised client-delivery stack sold in Tier 1–3 retainers: citation reporting, monitoring SLAs, multi-tool MCP, inventory sync, abuse controls, and operational notification. Tier 1 GEO artifacts and the MCP half of Tier 2 are demoable today; reporting, Tier 2 “24/7”, and all of Tier 3 remain gaps.
Requirement model (what “good” looks like)
GEO — Generative Engine Optimization
| Requirement |
Why it matters |
Machine-readable business facts (llms.txt / equivalent) |
LLMs ingest dense, citable facts without scraping marketing prose |
| Entity-consistent structured data (JSON-LD / Schema.org) |
Anchors brand, location, offers, and services in a graph engines can reuse |
| Location / vertical / intent signals |
Steers when the model should cite the business |
| Preferred citation phrasing |
Reduces hallucinated names, prices, and attributes |
Conventional crawler hygiene (robots.txt, sitemap, metadata) |
Complements GEO for traditional + hybrid retrieval |
| Single source of truth for facts |
Prevents models from quoting contradictory prices or claims |
| Citation measurement methodology |
Makes retainers defensible (non-deterministic LLM answers) |
MCP — Model Context Protocol / Agentic Action Layer
| Requirement |
Why it matters |
| Remote MCP server reachable by hosts |
Agents can invoke tools without leaving the chat |
| Discoverable endpoints (from GEO artifacts) |
Agents find tools from llms.txt / schema, not tribal knowledge |
| Real tools bound to business systems |
Differentiator vs content-only GEO agencies |
| OpenAPI / Actions mirror |
Coverage for non-MCP hosts (ChatGPT Actions, etc.) |
| Validation + structured errors |
Agents can re-prompt users instead of failing opaquely |
| Transport suitable for serverless |
Stateless Streamable HTTP for multi-instance deploys |
| Auth / rate limits / durability (production) |
Public tools without abuse controls are operational risk |
| Broader tool surface (booking, inventory, vertical workflows) |
Playbook Tier 3 and §1 “book / reserve” claims |
What is implemented
GEO visibility layer — present
| Component |
Location |
Notes |
Canonical llms.txt |
public/.well-known/llms.txt → /.well-known/llms.txt |
Business, pitch, priced services, location signals, agent capabilities, preferred citations |
| Root mirror |
public/llms.txt → /llms.txt |
Byte-identical to well-known at inspection (diff silent) |
| JSON-LD graph |
components/GeoSchema.tsx in app/layout.tsx |
Organization, ProfessionalService, 3× SoftwareApplication, OfferCatalog |
| Fact source for schema |
lib/content.ts (siteConfig) |
Identity, Dubai Marina location, DHA/DED, pricing, agent URLs, social |
| Geo / compliance signals |
GeoSchema + llms.txt |
GeoCoordinates, areaServed, DHA/DED additionalProperty |
| Agent discovery in GEO |
llms.txt §§ Explicit Agent Capabilities; schema MCP Endpoint / OpenAPI Definition |
Bridges visibility → action |
| Page metadata |
app/layout.tsx |
Title, description, keywords (GEO/MCP), OG/Twitter, canonical, robots index/follow |
| Marketing GEO surface |
components/geo-readout.tsx |
Human-facing GEO section (not crawler infra) |
MCP / action layer — present
| Component |
Location |
Notes |
| Remote MCP route |
app/api/mcp/[transport]/route.ts |
Transports sse + mcp; nodejs, maxDuration=60 |
| Server + transport |
lib/mcp-server.ts |
@modelcontextprotocol/sdk ^1.29.0; WebStandardStreamableHTTPServerTransport; stateless |
| Tool |
request_dev_consultation |
Only registered tool; model-oriented description + Zod input schema |
| OpenAPI mirror |
public/docs/openapi.json + POST /api/leads/submit |
ChatGPT Actions / Claude-style hosts |
| Shared lead pipeline |
lib/leads.ts |
Zod validation, lead_id, source (mcp | openapi | api), CRM webhook |
| CRM delivery path |
CRM_WEBHOOK_URL + scripts/google-apps-script/ |
Recommended: Apps Script → Google Sheet |
| CORS for agents |
MCP + leads routes |
Access-Control-Allow-Origin: * |
| On-site form (human) |
POST /api/contact |
Separate from agent lead path |
Supporting product / knowledge — present
- Positioning ADRs (0001–0004 accepted; 0005 proposed)
- Architecture and integration docs that already flag playbook-vs-code gaps
- Dogfood demo framing (site as live proof asset)
What is missing or incomplete
Critical gaps (block sellable Tier 1–2 retainers as written)
| Gap |
Requirement source |
Impact |
| No citation-report methodology or tooling |
Tier 1–3 deliverable; ../strategy/kpis.md |
Retainer has no measurable recurring output |
| No MCP / GEO uptime monitoring or alerting |
Tier 2 “24/7 hosting & monitoring” |
SLA sold without instrumentation; demo outage = lost deals |
| No lead-arrival notification |
Success message promises ~1h WhatsApp/Email follow-up |
Unattended agent commitment with no ping to owner |
| Public endpoints: no auth, no rate limit, no spam protection |
ADR-0003 follow-ups |
Sheet flood / junk leads |
| No webhook retry / queue / DLQ |
../integrations/lead-capture.md |
Transient CRM failure loses the lead |
Pricing contradiction (playbook tiers vs published llms.txt) |
ADR-0005 |
GEO layer publishes a different offer than sales materials |
High gaps (Tier 2 claims / production hardening)
| Gap |
Notes |
| WhatsApp not wired |
Generic webhook only; pitch says “WhatsApp or CRM instantly” |
| No persistence beyond Sheet |
No DB/ORM; no durable audit trail in-app |
| MCP tools only — no resources or prompts |
Spec supports resources/prompts; unused |
| Exactly one MCP tool / one OpenAPI path |
Tier 3 sells “multi-endpoint MCP tools” |
| No booking / calendar integration |
Playbook §1 “book consultations” |
| No reservation / inventory / property sync |
Playbook §1 + Tier 3 |
| No CI |
No .github/workflows; regressions on sales-critical routes unguarded |
No automated llms.txt parity check |
Dual static files can drift |
Facts duplicated across content.ts and both llms.txt files |
Schema follows content; llms.txt does not — drift risk (already pricing tension) |
Medium gaps (GEO completeness / ops)
| Gap |
Notes |
No robots.txt / sitemap.xml (app/robots.ts / app/sitemap.ts also absent) |
Conventional crawler hygiene |
| No analytics / citation observation SDK |
Cannot measure organic AI referral |
| No client-provisioning runbooks |
How to stand up per-client MCP + GEO is undocumented |
| No vertical field on leads |
Target verticals (clinic, rental, etc.) collapse to geo_ai_integration |
| Contact form not unified with lead pipeline |
/api/contact bypasses submitConsultationLead() |
Optional email (RESEND_*) unused for leads |
.env.example hooks only |
Claim vs reality matrix (playbook)
| Playbook / tier claim |
Repo reality |
llms.txt + JSON-LD GEO |
Implemented |
| Content restructuring / entity facts |
Implemented (lib/content.ts + site) |
| Monthly citation reports |
Missing |
| Remote MCP + lead capture |
Implemented (single tool) |
| CRM / WhatsApp integration |
Partial (webhook → Sheet; WhatsApp = human follow-up promise) |
| 24/7 hosting & monitoring |
Missing tooling |
| Multi-endpoint MCP tools |
Missing |
| Live inventory / property sync |
Missing |
| Book consultations / process reservations |
Missing (lead capture only) |
| Competitor displacement cadence |
Missing process |
Coverage scores (heuristic)
Relative to a full GEO + MCP productised offer (not to a marketing-site MVP):
| Domain |
Implemented |
Score |
| GEO discovery artifacts |
Dual llms.txt, location/intent/citation sections |
~80% |
| GEO structured data |
Rich multi-type JSON-LD + offer catalog |
~85% |
| GEO fact consistency |
Dual files + content drift; pricing ADR open |
~55% |
| GEO measurement / reporting |
None |
~5% |
| Conventional SEO crawl aids |
Metadata yes; robots/sitemap no |
~40% |
| MCP transport & hosting pattern |
Stateless Streamable HTTP, CORS, dual paths |
~90% |
| MCP tool surface |
One tool; no resources/prompts |
~25% |
| Agent host coverage |
MCP + OpenAPI |
~75% |
| Business-system binding |
Webhook → Sheet; no WhatsApp/calendar/PMS |
~35% |
| Production hardening |
No auth/rate limit/retry/CI/monitoring |
~20% |
Overall: strong dogfood demo / Tier 1 artifact + MCP proof; weak retainer operations and Tier 3 action depth.
Priority roadmap (engineering, not calendar)
Ordered by risk to revenue and credibility:
- Resolve ADR-0005 — Align public GEO facts with the commercial offer (or stop quoting tiers).
- Write citation-report methodology — Frozen prompts, engines/modes, run counts, frequency metric; then optional automation.
- Lead notification + abuse controls — Owner alert on lead; rate limit public MCP/REST endpoints.
- Uptime checks on
/api/mcp/sse, both llms.txt paths, /docs/openapi.json.
- Webhook durability — Retry/queue or at least persist failed payloads.
- Generate
llms.txt from lib/content.ts + CI parity check; add robots.ts / sitemap.ts.
- Expand MCP tool surface only when selling vertical workflows (booking, inventory) — quote as engineering, not as included Tier 2.
- Client delivery pack — Template GEO/MCP deploy runbook for non-JSGlobtech domains.
Sellable today vs do-not-claim
Safe to demonstrate / sell as shipped
- Dual-path
llms.txt with citation and agent discovery sections
- Schema.org JSON-LD with Dubai/UAE entity and offer signals
- Live remote MCP
request_dev_consultation
- OpenAPI lead action + shared validation
- Webhook delivery to Google Sheets (when
CRM_WEBHOOK_URL set)
Do not claim as implemented
- Calendar booking or reservation processing inside chat
- Native WhatsApp delivery (unless a separate relay is built for that client)
- 24/7 monitoring SLA
- Multi-tool MCP / live inventory sync
- Automated monthly citation reporting
- Fixed GEO retainer prices while
llms.txt still says custom scoping
File map (quick reference)
GEO
public/.well-known/llms.txt canonical facts
public/llms.txt mirror
components/GeoSchema.tsx JSON-LD
lib/content.ts schema fact source
app/layout.tsx metadata + GeoSchema mount
MCP / agents
app/api/mcp/[transport]/route.ts
lib/mcp-server.ts
app/api/leads/submit/route.ts
public/docs/openapi.json
lib/leads.ts
scripts/google-apps-script/
Absent
robots.txt / sitemap
monitoring / CI / rate limits
MCP resources & prompts
booking / inventory tools
citation reporting tooling
Method
Inspection of application code under app/, components/, lib/, public/, package.json, and cross-check against knowledge/ ADRs, architecture/geo-stack.md, integrations/mcp-server.md, integrations/lead-capture.md, sales/pricing-tiers.md, and strategy/kpis.md. Playbook claims not present in code are listed as gaps rather than assumed delivered.