auditreach
Allows searching Reddit through its official API, including subreddit-specific queries, with OAuth script-app authentication and hash-chained audit logging.
Allows searching YouTube through its official API, including channel-specific queries, with API key authentication and hash-chained audit logging.
auditreach
Install • What it does • Getting started • Commands • Security • FAQ
Research Reddit and YouTube from your AI agent using only official APIs, your own keys, and a log that proves exactly what you queried and why it was allowed.

Install
auditreach ships as two independent, equally first-class packages: an npm
package (this repo, JavaScript/TypeScript) and a
PyPI package (python/,
Python). Both implement the same hash-chain algorithm and BYOK model
against the same official Reddit/YouTube APIs. Pick whichever fits your
toolchain, or install both.
npm:
npx auditreach-cli search --platform reddit --query "your query"Or install it globally:
npm install -g auditreach-cli
auditreach search --platform reddit --query "your query"pip:
pip install auditreach-cli
auditreach search --platform reddit --query "your query"See python/README.md for Python-specific usage, including this distribution's added env-var BYOK credential path (useful for headless CI/agent sandboxes) -- the npm package stores credentials in the OS keychain only.
Building from source works the same way, if you want to read or modify the code first:
git clone https://github.com/RudrenduPaul/auditreach.git
cd auditreach
npm install
npm run build
node dist/cli.js search --platform reddit --query "your query"Related MCP server: AgentLens
What it does
node dist/cli.js search --platform reddit --query "agent memory poisoning" --subreddit MachineLearning
AuditReach -- Official-API Research CLI
Platform: Reddit | Auth: OAuth script-app grant, read-only, public-subreddit scope
Fetching... (official API, rate-limit aware)
✓ 14 results returned (Reddit API Terms -- public content, official API, read-only script-app credentials)
RESULTS (14)
[1] "How are people testing for memory poisoning in long-running agents?"
u/some_researcher · 2026-07-05T14:22:00.000Z
https://reddit.com/r/MachineLearning/comments/...
...
Audit log entry written: ar_2026-07-12_9f3c2a
Consent basis: Reddit API Terms -- public content, official API, read-only script-app credentials
Full results: ./auditreach-results-2026-07-12.json
Full audit trail: ./auditreach.log.jsonlEvery entry in auditreach.log.jsonl is hash-chained -- each entry's hash is computed from its own content, and the next entry references it. Editing, deleting, or reordering an entry breaks the chain:
$ node dist/cli.js verify-log
Verifying ./auditreach.log.jsonl...
✓ Chain intact: 14 entries, no gaps, no tampering detected.
# after someone hand-edits a line in the log file:
$ node dist/cli.js verify-log
Verifying ./auditreach.log.jsonl...
✗ Chain broken at entry 3 (ar_2026-07-12_9f3c2a): entry ar_2026-07-12_9f3c2a hash does not
match its own content -- entry was edited after being written
How it compares
auditreach | Agent-Reach | snoowrap | |
Access model | Official API only, BYO-key | Cookie/session import, "zero API fees" | Official API, BYO-key |
Platform coverage | Reddit, YouTube | Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu | Reddit only |
Consent/audit log | Hash-chained, per-query, local | None | None |
Maintenance status | Active (this release) | Active, 65k+ stars | Archived since Feb 2023 |
License | Apache 2.0 | MIT | MIT |
Runtime deps (Reddit client) | 0 -- native | n/a (Python, browser-session based) |
|
Numbers measured directly against each repo's public GitHub metadata and, for the dependency comparison, against snoowrap's own published package.json as of this writing -- reproducible by anyone with gh api repos/<owner>/<repo>.
We started building auditreach's Reddit client on top of snoowrap, the most-used Reddit API wrapper in the Node ecosystem. Installing it pulls in request, request-promise, form-data, and har-validator -- a dependency chain that currently carries 2 CRITICAL, 2 HIGH, and 5 moderate severity advisories (9 total, per npm audit), none of which snoowrap can fix because the project has been archived since 2023. We rewrote the Reddit client as a direct fetch-based OAuth2 client against Reddit's own documented REST endpoints instead: same functionality, none of those CVEs, zero extra runtime dependencies for that client. See Security for auditreach's own current npm audit status.
Why auditreach exists
A consultancy we talked to had an AI research agent pulling social sentiment for a client report. It worked well until the client's legal team asked, in writing, what authority the data collection was under. The honest answer was "a browser cookie session," because the tool they were using authenticates by importing a logged-in session and scraping as if it were a real user. That works. It is also not an answer you can put in a compliance memo, and it is the exact pattern Reddit sued Anthropic and SerpApi over in 2025, and the same pattern that got Pushshift's public API access shut down by Reddit back in 2024.
Agent-Reach is not a bad tool. It has real traction (65k+ stars) because cookie-based scraping genuinely covers more ground than any official API does today, at zero API cost. But "covers more ground" and "an agency's client can pass a compliance review" are two different bars, and nothing was built specifically to clear the second one.
auditreach is the CLI we wished existed instead. It talks to Reddit and YouTube only through their official, documented APIs, using your own API keys -- never a shared pool -- and every single query writes a hash-chained entry to a local audit log: which platform, which endpoint, which scope, and a plain-language line explaining the consent/ToS basis for that specific call. No cookie import. No session-token reuse. No code path that could even pretend to be a logged-in human.
We are not trying to out-cover Agent-Reach's six platforms. auditreach is narrower on purpose, for the buyer who structurally can't use a cookie-based tool at all.
Getting started
1. Install: see Install above -- npx auditreach-cli, npm install -g auditreach-cli, or clone and build from source.
2. Set up credentials for the platform you want to search (BYO-key -- your own, never ours):
node dist/cli.js auth --platform reddit
# Prompts for Client ID, Client secret, username, password.
# Create a script-app at https://www.reddit.com/prefs/apps first.
node dist/cli.js auth --platform youtube
# Prompts for an API key.
# Create one at https://console.cloud.google.com/apis/credentialsAll credentials are stored in your OS keychain (@napi-rs/keyring), never in a config file, never transmitted anywhere except the platform's own official auth endpoint. Once credentials are set, verify them without running a real search:
node dist/cli.js auth --platform reddit --verify3. Search:
node dist/cli.js search --platform reddit --query "your query" --subreddit some_subreddit
node dist/cli.js search --platform youtube --query "your query" --channel @SomeChannelHonest note on setup time: getting your own API credentials from Reddit and Google takes a few minutes the first time -- this is slower than Agent-Reach's cookie-import flow (which just reuses a browser session you already have) by design. BYOK means the setup cost is real, not hidden.
Commands
auditreach has four subcommands. Every flag below is pulled directly from the CLI's own --help output, not from memory of what it used to support.
auditreach search
Search a platform using its official API only.
Flag | Description |
|
|
| search query (required) |
| restrict search to one subreddit (Reddit only) |
| restrict search to one channel, e.g. |
| only results published after this date, e.g. |
| maximum results to return (default: 25; platform caps: 100 Reddit / 50 YouTube) |
| page results before this Reddit fullname cursor, e.g. |
| page results after this Reddit fullname cursor, e.g. |
| write full results JSON to this path |
| print structured JSON to stdout instead of human-readable output, for scripts and agent callers |
node dist/cli.js search --platform reddit --query "agent memory poisoning" --subreddit MachineLearning --max-results 50
node dist/cli.js search --platform reddit --query "agent memory poisoning" --json | jq '.results | length'auditreach auth
Set up, verify, or clear BYOK credentials for a platform (stored in your OS keychain).
Flag | Description |
|
|
| delete stored credentials for this platform |
| verify stored credentials are valid without running a search (no results file, no audit-log entry) |
| with |
node dist/cli.js auth --platform reddit --verifyauditreach verify-log
Verify the local hash-chained audit log has not been tampered with.
Flag | Description |
| path to the audit log file (defaults to |
node dist/cli.js verify-log --path ./auditreach.log.jsonlauditreach mcp
Run a Model Context Protocol server over stdio (built on the official @modelcontextprotocol/sdk), exposing exactly 3 tools so an AI agent can call this CLI directly instead of shelling out and parsing stdout:
Tool | Equivalent to | Notes |
|
| Same parameters: platform, query, subreddit/channel, since, maxResults, before/after |
|
| Read-only. Checks whether stored credentials are valid -- cannot set or clear them |
|
| Same parameters: path |
node dist/cli.js mcp
# or, once published: npx auditreach-cli mcpAdd it to your MCP client's config (for Claude Desktop, claude_desktop_config.json). Either
distribution works since both ship the same mcp subcommand:
{
"mcpServers": {
"auditreach": {
"command": "npx",
"args": ["-y", "auditreach-cli", "mcp"]
}
}
}or, from the PyPI package:
{
"mcpServers": {
"auditreach": {
"command": "uvx",
"args": ["--from", "auditreach-cli", "auditreach", "mcp"]
}
}
}Setting up or clearing BYOK credentials (auditreach auth --platform <p> / --clear) is deliberately not exposed over MCP -- that stays a local-CLI-only, human-driven action, so a calling agent can check whether credentials work but can never provision or wipe them itself. See .well-known/agent.json for the machine-readable manifest (auth requirements, tool schemas, invocation commands) that an agent or agent registry can read to discover this server without a human reading the README first.

Run auditreach <command> --help any time to see the exact flags your installed version supports.
Library API reference
auditreach-cli doubles as an importable library. Every export below comes straight from dist/index.d.ts in the published package.
import {
RedditClient,
YoutubeClient,
getCredential,
setCredential,
deleteCredential,
getRedditCredentials,
getYoutubeCredentials,
appendAuditLogEntry,
getLastEntryHash,
computeEntryHash,
verifyAuditLogChain,
credentialFingerprint,
canonicalJson,
sha256Hex,
DEFAULT_AUDIT_LOG_PATH,
executeSearch,
SearchCommandError,
checkAuthStatus,
executeVerifyLog,
buildMcpServer,
runMcpServerCommand,
} from "auditreach-cli";Clients
new RedditClient(credentials: RedditCredentials)-- talks to Reddit's official OAuth API only, using the password grant ("script app" flow)..search(options: RedditSearchOptions): Promise<SearchOutcome>,.verifyCredentials(): Promise<void>.new YoutubeClient(credentials: YoutubeCredentials)-- wraps the official YouTube Data API v3..search(options: YoutubeSearchOptions): Promise<SearchOutcome>,.verifyCredentials(): Promise<void>(a 1-quota-unit call, no query needed).
const credentials = getRedditCredentials();
if (!credentials) throw new Error("run `auditreach auth --platform reddit` first");
const client = new RedditClient(credentials);
const outcome = await client.search({
query: "agent memory poisoning",
subreddit: "MachineLearning",
});Credentials (setCredential / getCredential / deleteCredential / getRedditCredentials / getYoutubeCredentials) -- all credential I/O goes through this module. It's the one place allowed to touch a raw secret; values come back only to hand directly to a client's constructor, never to log or print.
Audit log
appendAuditLogEntry(entryWithoutHash: UnhashedAuditLogEntry, logPath?: string): Promise<AuditLogEntry>-- the only write path into the log; entries are never edited or deleted in place.getLastEntryHash(logPath?: string): Promise<string | null>computeEntryHash(entry: UnhashedAuditLogEntry): stringverifyAuditLogChain(logPath?: string): Promise<ChainVerificationResult>-- re-derives every entry's hash and checks the chain end to end.DEFAULT_AUDIT_LOG_PATH--"./auditreach.log.jsonl"
const result = await verifyAuditLogChain();
if (!result.valid) {
console.error(`Chain broken at entry ${result.brokenAtIndex}: ${result.reason}`);
}Crypto utilities
canonicalJson(value: unknown): string-- recursively sorts object keys so the same logical entry always serializes to the same bytes, which the hash chain depends on to verify deterministically.sha256Hex(input: string): stringcredentialFingerprint(secret: string): string-- keeps only the last 6 hex characters of the hash, enough to distinguish rotated keys in a local audit log, never enough to be a partial credential leak.
Command cores and MCP
executeSearch(args),checkAuthStatus(platform),executeVerifyLog(path?)-- the same programmatic cores thesearch/auth --verify/verify-logCLI commands and the MCP tools both call into; none of them write to console/stdout, so they're safe to call from any host, including one sharing stdout with an MCP transport.SearchCommandError-- the error classexecuteSearchthrows for an expected, user-actionable failure: no BYOK credentials stored yet for the target platform, or a Reddit search called without--query. Catch it specifically to distinguish "you called this wrong" from a real network/API failure.buildMcpServer({ version }): McpServer-- constructs the MCP server (from@modelcontextprotocol/sdk) with thesearch/auth_status/verify_logtools registered, without starting a transport -- useful for testing or embedding in a larger MCP server.runMcpServerCommand({ version })-- whatauditreach mcpruns: builds the server and connects it over stdio. Never returns while the server is running.
No generated API docs site exists yet (no TypeDoc build wired into CI) -- the exports above are the complete public surface. Check dist/index.d.ts in the published package for exact types.
The Python package (auditreach-cli on PyPI) exposes the same surface with snake_case names -- from auditreach import RedditClient, YoutubeClient, get_reddit_credentials, verify_audit_log_chain, ... -- see python/README.md for the full Python API reference.
Platform coverage
Platform | API used | Status | Known constraint |
Reddit API (OAuth2 password grant, direct REST) | Shipped | Rate limits are generally workable for real research volumes | |
YouTube | YouTube Data API v3 ( | Shipped | Quota-based (10,000 units/day default), generally workable |
X (Twitter) | X API v2 | Not yet shipped | X's official API pricing and post-volume caps have been widely reported as prohibitive for small teams doing meaningful research since the 2023 pricing changes. Deferred until a real user needs it enough to fund working around that constraint -- shipping it half-working would undercut the entire "honest about what official APIs can and can't do" premise this tool is built on. |
Result limits
--max-results <n> controls how many items a single search call returns. Leave it off and auditreach silently applies a default of 25 -- the same shape of surprise PRAW's get_comments() had for years (praw#119): a caller who does not already know to pass the flag gets a quietly truncated result set.
A search that returns exactly the applied limit (25 by default, or your--max-results value) may not be the full result set. auditreach prints a stderr warning when this happens, but scripts that only parse stdout/--json output won't see it -- check for the warning or pass an explicit --max-results if completeness matters.
Platform | Default (flag omitted) | Maximum ( |
25 | 100 | |
YouTube | 25 | 50 |
Values above the cap are silently clamped to it. For Reddit, --before/--after let you page through a search's result set using the real cursor Reddit's own response returns, up to Reddit's own ~1,000-item search cap (see Success stories for why cursor pagination alone can't go further than that); YouTube has no equivalent yet. Whenever the number of items returned equals the limit that was actually applied, whether that is the silent default or an explicit --max-results value, auditreach prints a warning to stderr telling you more results may exist and how to raise --max-results (up to the platform cap).
What is a "consent basis," honestly
The consent_basis field on every audit-log entry names the specific platform API terms and auth mechanism used for that query. It certifies that the request went through the platform's official, documented API surface under the credentials you supplied. It does not certify that your specific use case is legally sufficient for your jurisdiction or contract -- that determination is yours to make, informed by an accurate, complete, tamper-evident record of what actually happened.
Self-hosting / local-only by default
Nothing about auditreach requires a hosted account or server. Every command runs entirely on your machine; the audit log is a plain file you own. This is the same flow as Install above:
git clone https://github.com/RudrenduPaul/auditreach.git
cd auditreach
npm install
npm run build
node dist/cli.js search --platform reddit --query "..."Development
TypeScript (this package):
npm install
npm run lint # ESLint
npm run format # Prettier check
npm run typecheck # tsc --noEmit --strict
npm run test:coverage # vitest, 91 tests, 95.1% statement coveragePython (python/):
cd python
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # 95 testsSee CONTRIBUTING.md for the rules on adding a new platform client -- the short version: official API only, honest rate-limit disclosure, tests that mock the network boundary, never anything that reads or writes a raw credential outside src/auth/credential-store.ts (or python/src/auditreach/auth/credential_store.py on the Python side).
Security
See SECURITY.md for the vulnerability disclosure policy. A pre-launch OWASP/STRIDE review found zero CRITICAL/HIGH findings in auditreach's own code. ip-address and hono -- both pulled in transitively by the official @modelcontextprotocol/sdk dependency's HTTP-transport code, a path auditreach mcp never runs (it only ever starts the SDK's stdio transport, StdioServerTransport) -- previously carried advisories; package.json's overrides field now pins both to patched versions. As of this writing, npm audit --audit-level=high on a fresh install reports 0 vulnerabilities. GitHub secret scanning and push protection are enabled on this repo.
Success stories
Four real issues reported against praw-dev/praw -- PRAW, Reddit's official Python API
wrapper, and the closest thing this project has to prior art -- root-caused against
auditreach's own source and used to close genuine gaps in this tool before it had a
single outside user. Each line below is tied to the actual report that prompted it.
praw#614 (@mananwason) -- asked how to page past Reddit's ~1,000-result search cap. The real fix is narrower than that: Reddit's own API returns no before/after cursor at all once you're past that cap, cursor-based paging or not -- confirmed directly in the issue thread. What
search()actually does now is extract the real cursor from Reddit's response (SearchOutcome.nextCursor) and expose--before/--afterflags so you can page through the results within a single search's capped result set, instead of only ever seeing the first page. Going past the 1,000-item cap itself needs cloudsearch timestamp-window re-querying, which isn't built yet.praw#1939 (@Auditormadness9) -- hit an undiagnosed 400 error caused by a subreddit name that still carried a leading
r/prefix. Search errors now name that specific cause when it's the likely culprit: previously the CLI just returned a bare status code and left the guessing to you.praw#984 (@MaxMatti) -- asked for a simple way to check whether Reddit bot credentials were still valid, without PRAW's confusing
getMe()-recursion workaround.auditreach auth --platform reddit --verifydoes exactly that now: one lightweight check, no search required, nothing written to disk.praw#119 (@nsp) -- hit PRAW's historic silent 25-result default, discoverable only by reading an unrelated base class's docstring; PRAW's own maintainer admitted he "wasn't sure the best way to make this clear."
--helpand this README now state the real default and per-platform caps, and a runtime warning fires whenever a search actually got truncated.
FAQ
What is auditreach, and what makes it different from other Reddit/YouTube research tools? It is a BYOK CLI (and MCP server) that talks to Reddit and YouTube only through their official, documented APIs, using your own API keys, and writes a hash-chained audit-log entry for every query -- platform, endpoint, scope, and the specific consent/ToS basis for that call. The differentiator is what it refuses to do: no cookie import, no shared-session scraping, no code path that pretends to be a logged-in human. See Why auditreach exists for the full reasoning and How it compares for the table against named alternatives.
What platforms and versions does auditreach run on?
The npm package (auditreach-cli) requires Node.js 20 or newer (engines field in package.json). The PyPI package (also auditreach-cli) requires Python 3.10+ (requires-python in python/pyproject.toml), which also carries the Operating System :: OS Independent classifier. Credentials go into your OS keychain through @napi-rs/keyring (npm) or keyring (PyPI) instead of a config file, so there is no platform-specific setup beyond having Node or Python installed.
Does auditreach store my Reddit or YouTube credentials anywhere?
No. Credentials go straight into your OS keychain through @napi-rs/keyring (src/auth/credential-store.ts). There is no config file, no environment variable, and no code path that writes a raw credential to disk.
How many results does a search return by default, and can I get more?
25, silently, unless you pass --max-results -- see Result limits. The hard cap is 100 for Reddit and 50 for YouTube. A stderr warning fires whenever a search actually hits the applied limit, whether that's the silent default or an explicit value you passed.
How do I check my credentials are still valid without running a real search?
node dist/cli.js auth --platform reddit --verify (or --platform youtube). It performs the minimal authenticated check and reports pass or fail, with no --query needed, no results file written, and no audit-log entry appended.
Is the audit log actually tamper-evident, or just a log file?
Tamper-evident: each entry's hash is computed from its own content and the next entry references it, so verify-log can point to the exact entry a hand-edit broke. See the demo under What it does.
What are auditreach's current limitations?
Two worth knowing up front. First, X (Twitter) is not shipped -- X API v2's pricing and post-volume caps have been prohibitive for small teams doing real research since the 2023 changes; see Platform coverage. Second, Reddit paging: search() reads the real after/before cursor out of Reddit's own response and exposes --before/--after flags to page through a single search's result set, but that does not get you past Reddit's own ~1,000-item search cap -- see the praw#614 success story for what the fix covers and doesn't.
How does the MCP server mode work?
auditreach mcp (npm) or pipx run auditreach-cli mcp (PyPI) starts a Model Context Protocol server over stdio, built on the official @modelcontextprotocol/sdk / mcp SDKs. It exposes exactly 3 tools -- search, auth_status (read-only, cannot set or clear credentials), and verify_log -- each a thin wrapper around the same programmatic core the CLI commands use, so nothing is reimplemented for the agent path. See auditreach mcp above for the full tool table and .well-known/agent.json for the machine-readable manifest an agent registry can read directly.
How does auditreach compare to Agent-Reach specifically? Agent-Reach covers more platforms (six, versus auditreach's two) by importing a logged-in browser session and scraping as that user, at zero API cost. auditreach only calls official, documented APIs with your own keys and writes a hash-chained consent/audit entry per query; it has no session-import code path at all. Neither approach is strictly better -- they're built for different buyers. See How it compares for the full side-by-side.
Is auditreach free to use commercially, and what does the license actually require?
Yes. auditreach is Apache 2.0 (see LICENSE), which permits commercial use, modification, and redistribution, including as part of a closed-source product. The conditions are: include a copy of the license with anything you redistribute, mark any files you modified, and keep the existing copyright/attribution notices. It does not grant rights to auditreach's name or trademarks.
Contributing
See CONTRIBUTING.md for the rules on adding a new platform client. Short version: official API only, honest rate-limit disclosure, tests that mock the network boundary, never a code path that reads or writes a raw credential outside src/auth/credential-store.ts.
License
Apache 2.0. See LICENSE.
Available Tools
3 toolsauth_statusA
Read-only check of whether BYOK credentials are already stored and still valid for a platform (equivalent to auditreach auth --platform <p> --verify --json). Call this before search to confirm credentials are configured and working, or whenever an agent needs to report connection health without touching the search API or the audit log. This tool deliberately exposes no way to set or clear credentials over MCP -- provisioning or wiping stored credentials stays a local, human-driven action via auditreach auth --platform <p> on the machine's own terminal, never something a calling agent can trigger remotely. Behaviorally, this is read-only: it makes a lightweight verification call against the platform's API to confirm the stored credential still works, but it never writes to the audit log and never mutates local credential storage. It is idempotent and safe to call repeatedly. Parameters: platform (required, 'reddit' or 'youtube'; any other value returns a structured unsupported-platform error rather than failing silently). Example calls: {"platform": "reddit"}; {"platform": "youtube"}. Returns a JSON object with success (bool) and exitCode (int); on success the payload confirms credentials are present and valid, on failure error explains what's missing (e.g. no credentials stored, or the stored credential was rejected by the platform).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It thoroughly discloses that the tool is read-only, idempotent, safe to repeat, makes a lightweight verification call, never writes to the audit log, and never mutates credential storage. It even details the error behavior for unsupported platforms. This is exemplary transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized into clear segments: purpose, usage, behavioral disclaimers, parameters, examples, and return format. It contains minimal redundancy, though 'read-only' and 'never writes to the audit log' are repeated across sentences. Still, every paragraph adds needed nuance, so it's appropriately sized for a tool with no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has one parameter, no annotations, and no schema-level parameter docs, the description covers all necessary aspects: what the tool does, when to invoke it, its exact behavioral constraints, accepted parameter values, example calls, and the detailed return shape. Even though an output schema exists, the description goes beyond it by explaining success/failure semantics. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema merely defines `platform` as a string with 0% description coverage. The description compensates fully by specifying allowed values ('reddit' or 'youtube'), the structured error for other values, and example calls. This is exactly the kind of added meaning needed for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Read-only check of whether BYOK credentials are already stored and still valid for a platform.' It clearly distinguishes this from siblings by noting it should be called before `search` and that it does not touch the search API or audit log. The tool's limited scope (verification only) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this before `search` to confirm credentials are configured and working, or whenever an agent needs to report connection health.' It also explains what it is not for (setting/clearing credentials) and contrasts with remote mutability. This is direct, actionable context for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Reddit or YouTube through its official, documented API only (no scraping, no cookie import, no logged-in-human impersonation) using your own BYOK credentials, and return matching posts/videos as structured JSON. Call this whenever an agent needs recent or historical public content from one of these two platforms for research, monitoring, or compliance review; do not call it for platforms other than reddit/youtube (it returns a clear unsupported-platform error rather than guessing) or when you only need to check whether credentials work (use auth_status for that, it's cheaper and makes no search API call). Prerequisite: BYOK credentials for the target platform must already be stored locally via auditreach auth --platform <platform> -- this tool never sets up credentials itself and will fail fast with a 'No credentials found' error if they are missing. Side effects: makes a live network call to Reddit's or YouTube's official API (consuming that platform's rate limit/quota), and on success appends one tamper-evident, hash-chained entry to the local audit log recording platform, endpoint, scope, and timestamp -- this tool is not read-only and not idempotent in the sense that every successful call grows the audit log by one entry, though repeating an identical search is otherwise safe and does not mutate any remote state. If output is given, the full result set is also written to that local file path. Parameters: platform (required, 'reddit' or 'youtube'); query (search terms, required for reddit, optional for youtube); subreddit (reddit only, restrict to one subreddit, e.g. 'MachineLearning'); channel (youtube only, restrict to one channel handle, e.g. '@AnthropicAI'); since (youtube only, ISO date like '2026-06-01', only results published after this date); max_results (int, default 25, capped at 100 for reddit and 50 for youtube); before/after (reddit only, fullname pagination cursors like 't3_abc123'); output (optional local file path to also write the full JSON results to). Example calls: {"platform": "reddit", "query": "prompt injection", "subreddit": "MachineLearning", "max_results": 20}; {"platform": "youtube", "channel": "@AnthropicAI", "since": "2026-06-01", "max_results": 10}. Returns a JSON object with success (bool), exitCode (int), and on success a results array of items shaped like {id, title, url, createdAt, author, score, extra}; on failure an error string explains what went wrong (missing credentials, missing query, unsupported platform, or an upstream API error) instead of raising an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| query | No | ||
| since | No | ||
| before | No | ||
| output | No | ||
| channel | No | ||
| platform | Yes | ||
| subreddit | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full weight and discloses critical side effects: makes a live network call consuming rate limits, appends a tamper-evident hash-chained entry to the audit log on success, is not read-only, and returns an error string rather than throwing an exception. This is thorough behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though lengthy, the description is well-structured: purpose/constraints, usage guidelines, side effects, parameter details, examples, and return format. Every sentence adds necessary information; there is no redundancy or filler, making the length appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 9 parameters, no annotations, and an output schema is referenced but not detailed, the description covers all necessary context: prerequisite credentials, platform-specific restrictions, failure modes (missing credentials, unsupported platform), side effects, return shape, and pagination. It is fully complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage and only parameter titles, but the description fully compensates by explaining each parameter's purpose, platform-specific applicability (e.g., subreddit for reddit only, channel for youtube only), defaults, caps (max_results capped at 100 for reddit and 50 for youtube), and even example calls. This adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search Reddit or YouTube through its official, documented API... and return matching posts/videos as structured JSON.' It also distinguishes itself from sibling tools by explicitly directing credential checks to auth_status, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use ('Call this whenever an agent needs recent or historical public content... for research, monitoring, or compliance review') and when-not-to-use (platforms other than reddit/youtube, credential checks). It names auth_status as the cheaper alternative for credential validation, satisfying the need for alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_logA
Verify that the local hash-chained audit log has not been tampered with, by walking every entry and confirming each one's hash correctly chains to the previous entry (equivalent to auditreach verify-log --json). Call this to prove compliance/audit integrity before sharing the log with a third party, after any manual edit to the log file, or periodically as a trust check -- it does not need to run before every search. This tool is fully read-only: it opens and reads the log file but never writes to it, is idempotent, and produces the same verdict on repeated calls against an unchanged file. Prerequisite: an audit log file must already exist (one is created automatically the first time search succeeds); pointing this at a path with no log file returns a structured failure rather than raising. Parameters: path (optional string; defaults to ./auditreach.log.jsonl in the current working directory if omitted). Example calls: {} (verify the default log); {"path": "./auditreach.log.jsonl"}. Returns a JSON object with success (bool, true only if the entire chain verifies intact) and exitCode (int); on failure error describes the problem, such as a broken hash link at a specific entry index or a missing/unreadable log file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses read-only behavior ('opens and reads the log file but never writes'), idempotency, the prerequisite of an existing log file, and the structured failure mode instead of raising an exception. It also explains return values on both success and failure, leaving no behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but tightly organized, moving from purpose to usage, safety, prerequisite, parameter format, and return value. No sentence is redundant; each adds necessary information for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all relevant aspects: what the tool verifies, when to call it, read-only guarantees, prerequisites, parameter semantics, and return values including failure cases. It is self-sufficient for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though the schema only shows an optional path with a default of null, the description explains the default value (`./auditreach.log.jsonl`), gives example calls, and clarifies that the path points to the log file. This adds essential meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Verify that the local hash-chained audit log has not been tampered with' and explains the method (walking entries and confirming hash chains). This clearly distinguishes it from siblings like search and auth_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call — 'before sharing the log with a third party, after any manual edit to the log file, or periodically as a trust check' — and clarifies when not needed: 'it does not need to run before every search'. This provides clear usage boundaries relative to the search sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: search performs live searches and logs them, auth_status is a read-only credential preflight, and verify_log validates audit log integrity. There is no overlap or ambiguity between them.
All names use lowercase snake_case, which is consistent in style. However, 'search' and 'verify_log' are verbs while 'auth_status' is a noun phrase, so the verb_noun pattern is not perfectly uniform across the set.
Three tools is well-scoped for this server's narrow purpose: search, credential verification, and log verification. Each tool earns its place, and the count is within the ideal range.
The core workflow (search with audit logging, credential check, log verification) is well covered. A minor gap is that there is no tool to directly read the audit log entries, only to verify their integrity, but this appears intentional for security and is not a critical omission.
Maintenance
Related MCP Connectors
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
Hash-chained HMAC-signed audit log MCP for A2A (agent-to-agent) calls. Every tool-call, agent-ha...
Tamper-evident proof creation and verification for AI agents via MCP, A2A, and REST.
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTamper-evident audit logging for AI agents. Append-only, hash-chained, optionally Ed25519-signed log. The MCP server lets an agent keep and verify a record of what it actually did.7MIT
- AlicenseAqualityCmaintenanceAI-agent observability server whose distinguishing feature is a SHA-256 hash-chained, tamper-evident audit log with chain verification and signed export. Works with Claude Desktop, Cursor, and any MCP client.22222MIT
- AlicenseNot gradedqualityAmaintenanceLocal-first MCP server that lets AI agents query their own LLM call history as a branchable DAG and offload conversation context into immutable, AES-256-GCM-encrypted capsules — restorable in full or per segment, crypto-shreddable, with RAID-style replication. 12 tools, no API keys, no cloud.2902MIT
- FlicenseNot gradedqualityCmaintenanceProvides social media content extraction and analysis tools via MCP (Reddit and LinkedIn), while demonstrating security risks and obfuscation techniques for educational purposes.19
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/RudrenduPaul/auditreach'
If you have feedback or need assistance with the MCP directory API, please join our Discord server