Back to the catalog

io.github.houtini-ai/geo-analyzer

Scores content on the signals that get it cited by ChatGPT, Perplexity and AI Overviews

Open source Open in the app JSON README (API)

About

Scores content on the signals that get it cited by ChatGPT, Perplexity and AI Overviews

Details

Kind
MCP servers
Topic
Web search, scraping & browser
Publisher
houtini-ai
Origin
official
Category
ferramentas
Transport
local
Version
3.0.5
Stars
21
Forks
5
Last push
2026-08-15T11:27:33Z
Repository state
arquivado
Language
TypeScript
License
MIT
Added
2026-08-29 04:00:08
Updated
2026-08-29 04:00:08
Origin id
io.github.houtini-ai/geo-analyzer

README

> [!WARNING]
> **Deprecated and no longer maintained.** GEO Analyzer's AI-search content analysis has been consolidated into **[SEO Audit Console](https://github.com/houtini-ai/seo-audit)** (`npm i @houtini/seo-audit-console`) — which scores AI-Overview citation, passage relevance, agent readiness and content extractability alongside a full technical SEO audit, all in one MCP. Please migrate there.

---

<div align="center">
  <img src="https://raw.githubusercontent.com/houtini-ai/geo-analyzer/main/assets/logo.png" width="120" height="120" alt="GEO Analyzer" />
</div>

# GEO Analyzer

[![npm version](https://img.shields.io/npm/v/@houtini/geo-analyzer)](https://www.npmjs.com/package/@houtini/geo-analyzer)
[![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue?style=flat-square)](https://registry.modelcontextprotocol.io)
[![Known Vulnerabilities](https://snyk.io/test/github/houtini-ai/geo-analyzer/badge.svg)](https://snyk.io/test/github/houtini-ai/geo-analyzer)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

Content analysis for AI search visibility. Measures what actually matters for getting cited by ChatGPT, Claude, Perplexity, and Google AI Overviews.

<p align="center">
  <a href="https://glama.ai/mcp/servers/@houtini-ai/geo-analyzer">
    <img width="380" height="200" src="https://glama.ai/mcp/servers/@houtini-ai/geo-analyzer/badge" alt="GEO Analyzer MCP server" />
  </a>
</p>

> **Quick Navigation**
>
> [What it does](#what-it-does) | [Installation](#installation) | [Usage examples](#usage-examples) | [Output](#output) | [Tools](#tools) | [Troubleshooting](#troubleshooting) | [Research foundation](#research-foundation)

## What It Does

GEO Analyzer examines content for the signals AI systems use when selecting sources to cite:

- **Claim Density** - Extractable facts per 100 words
- **Information Density** - Word count vs predicted AI coverage
- **Answer Frontloading** - How quickly key information appears
- **Semantic Triples** - Structured (subject, predicate, object) relationships
- **Entity Recognition** - Named entities AI can reference
- **Sentence Structure** - Optimal length for AI parsing

The analysis runs locally using Claude Sonnet 4.5 for semantic extraction. No external services, no data leaving your machine.

## Installation

### Claude Desktop

Add to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "geo-analyzer": {
      "command": "npx",
      "args": ["-y", "@houtini/geo-analyzer@latest"],
      "env": {
        "ANTHROPIC_API_KEY": "sk-ant-..."
      }
    }
  }
}
```

**Config locations:**
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Linux: `~/.config/Claude/claude_desktop_config.json`

Restart Claude Desktop after saving.

### Claude Code (CLI)

Claude Code uses a different registration mechanism -- it doesn't read `claude_desktop_config.json`. Use `claude mcp add` instead:

```bash
claude mcp add -e ANTHROPIC_API_KEY=sk-ant-... -s user geo-analyzer -- npx -y @houtini/geo-analyzer@latest
```

Verify with:

```bash
claude mcp get geo-analyzer
```

You should see `Status: Connected`.

### Requirements

- Node.js 20+
- Anthropic API key ([console.anthropic.com](https://console.anthropic.com))

## Usage Examples

### Analyse a Published URL

```
Analyse https://example.com/article for "topic keywords"
```

The topic context helps score relevance but isn't required:

```
Analyse https://example.com/article
```

### Analyse Text Directly

Paste content for analysis (minimum 500 characters):

```
Analyse this content for "sim racing wheels":

[Your content here]
```

### Summary Mode

Get condensed output without detailed recommendations:

```
Analyse https://example.com/article with output_format=summary
```

## Output

### Scores (0-10)

| Score | Measures |
|-------|----------|
| **Overall** | Weighted average of all factors |
| **Extractability** | How easily AI can extract facts |
| **Readability** | Structure quality for AI parsing |
| **Citability** | How quotable and attributable |

### Key Metrics

**Information Density:**
- Word count with coverage prediction
- Optimal range: 800-1,500 words
- Pages under 1K words: ~61% AI coverage
- Pages over 3K words: ~13% AI coverage

**Answer Frontloading:**
- Claims and entities in first 100/300 words
- First claim position
- Score indicating answer immediacy

**Claim Density:**
- Target: 4+ claims per 100 words
- Extractable facts, statistics, measurements

**Sentence Length:**
- Target: 15-20 words average
- Matches Google's ~15.5 word chunk extraction

### Recommendations

Prioritised suggestions with:
- Specific locations in content
- Before/after examples
- Rationale based on research

## Tools

### analyze_url

Fetches and analyses published web pages.

| Parameter | Required | Description |
|-----------|----------|-------------|
| `url` | Yes | URL to analyse |
| `query` | No | Topic context for relevance scoring |
| `output_format` | No | `detailed` (default) or `summary` |

### analyze_text

Analyses pasted content directly.

| Parameter | Required | Description |
|-----------|----------|-------------|
| `content` | Yes | Text to analyse (min 500 chars) |
| `query` | No | Topic context for relevance scoring |
| `output_format` | No | `detailed` (default) or `summary` |

## Troubleshooting

**"ANTHROPIC_API_KEY is required"**
Add your API key to the `env` section in config.

**"Cannot find module" after config change**
Restart Claude Desktop completely.

**"Content too short"**
Minimum 500 characters required for meaningful analysis.

**Paywalled content returns errors**
The analyser can only access publicly available pages.

## Performance

- URL analysis: ~8-10 seconds
- Text analysis: ~5-7 seconds  
- Cost: ~$0.14 per analysis (Sonnet 4.5)

## Migration from v1.x

v2.0 removed external dependencies. Update your config:

**Old (v1.x):**
```json
{
  "env": {
    "GEO_WORKER_URL": "https://...",
    "JINA_API_KEY": "jina_..."
  }
}
```

**New (v2.x):**
```json
{
  "env": {
    "ANTHROPIC_API_KEY": "sk-ant-..."
  }
}
```

## Development

```bash
git clone https://github.com/houtini-ai/geo-analyzer.git
cd geo-analyzer
npm install
npm run build
```

## Research Foundation

The analysis methodology draws from peer-reviewed research and empirical studies:

### MIT GEO Paper (2024)
Aggarwal et al., "GEO: Generative Engine Optimization" - ACM SIGKDD

Key findings applied:
- Claim density target of 4+ per 100 words
- Optimal sentence length of 15-20 words
- 40% improvement in AI citation rates with extractability focus

[arxiv.org/abs/2311.09735](https://arxiv.org/abs/2311.09735)

### Dejan AI Grounding Research (2025)
Empirical analysis of 7,060 queries and 2,275 pages

Key findings applied:
- ~2,000 word total grounding budget per query
- Rank #1 source gets 531 words (28% of budget)
- Rank #5 source gets 266 words (13% of budget)
- Average extraction chunk: 15.5 words
- Pages <1K words: 61% coverage
- Pages 3K+ words: 13% coverage

[dejan.ai/blog/how-big-are-googles-grounding-chunks](https://dejan.ai/blog/how-big-are-googles-grounding-chunks/)  
[dejan.ai/blog/googles-ranking-signals](https://dejan.ai/blog/googles-ranking-signals/)

---

MIT License - [Houtini.ai](https://houtini.ai)

More