{"name":"com.tengence/geo","slug":"tengence-geo","title":"Tengence GEO Agent","description":"GEO/SEO content pipeline MCP: plan, write, gate-check, publish, submit, monitor AI visibility.","url":"https://mcp.market/server/tengence-geo","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"seo","tags":["seo","ai","maps"],"presence":{"score":28,"stars":0,"forks":0,"downloads_week":370,"last_push_at":"2026-10-02T16:03:13.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/tengence-team/tengence-geo-agent","website":null,"version":"0.1.2","remotes":[],"packages":[{"registryType":"npm","identifier":"@tengence/geo-mcp","version":"0.1.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"Root directory holding per-site config and .env files. Optional; the workspace is chosen at runtime via the workspace_use tool.","name":"SITES_ROOT"},{"description":"Internal runtime data directory (DB, caches). Defaults to ~/.tengence/geo-mcp.","name":"TENGENCE_GEO_HOME"},{"description":"Storage backend: sqlite (default) or mysql for production.","name":"DB_DRIVER"}]}],"tools":[{"name":"article_draft","description":"Assemble a ready-to-use writing brief for a new article: the matched T1–T7 body skeleton, the pre-writing research-brief template,","write_action":false,"price_micros":0,"input_schema":null},{"name":"article_export","description":"Export an article md + brief from the DB to the site data/inbox (for rewriting)","write_action":false,"price_micros":0,"input_schema":null},{"name":"article_ingest","description":"Content ingest (single entry): body md + research brief → articles table (CLI canonical orchestration)","write_action":false,"price_micros":0,"input_schema":null},{"name":"article_list","description":"List articles (articles table), with status/limit filters","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_check","description":"Validate a title/body against a platform's style rules — the 校验 (validation) half. Deterministic, no content generation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_list","description":"List all external content platforms in the syndicate registry: API type (official|cookie|none), status (ready|pending|manual),","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_plan_mark","description":"Update a channel_plan row status (todo | draft | published | paused) and optionally record its draft ids (media ids).","write_action":true,"price_micros":0,"input_schema":null},{"name":"channel_plan_next","description":"Per-platform publishing calendar: return the next article to publish for a platform plus all calendar rows","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_plan_reconcile","description":"Reconcile a platform channel_plan with what is ACTUALLY published on that platform (platform=juejin | csdn).","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_publish","description":"Publish/export to one external platform. Mode A: pass slugs[] and the server reads the DB and runs the platform pipeline","write_action":true,"price_micros":0,"input_schema":null},{"name":"channel_style_get","description":"Return the FULL platform style / rewrite rules for ONE platform (wechat / juejin / blog / …).","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_taxonomy_list","description":"Read the cached external-platform taxonomy dictionary (channel_taxonomy) — the platform's OWN categories and tags","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_taxonomy_resolve","description":"Preview how OUR taxonomy maps onto a platform's (article_plan.category/tags → platform category_id/tag_ids) WITHOUT","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_taxonomy_sync","description":"Refresh the cached dictionary of an EXTERNAL platform's own taxonomy (category + tag id/name) into the workspace","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_article","description":"Publish gate: enforces the editorial rules codified in the \"article-writing-standards\" standard (citation dual-channel, word count by T1–T7 type, banned words, the three GEO blocks — Summary / Key Takeaways / FAQ / Data Sources — and the research-brief hard check). Read that standard via standards_read before authoring, and run article_draft first to scaffold per-spec.","write_action":true,"price_micros":0,"input_schema":null},{"name":"csdn_article_delete","description":"Delete a CSDN article (blog/phoenix/console/v1/article/del). IRREVERSIBLE — pass confirm=true only after verifying the","write_action":true,"price_micros":0,"input_schema":null},{"name":"csdn_status","description":"Read the CSDN blog backend for this site: the draft box and the published list","write_action":false,"price_micros":0,"input_schema":null},{"name":"db_init","description":"Explicitly initialize the database (sqlite idempotent table creation / mysql DDL; --drop rebuilds)","write_action":false,"price_micros":0,"input_schema":null},{"name":"db_status","description":"Database status: driver, path, schema version, table list, missing tables","write_action":false,"price_micros":0,"input_schema":null},{"name":"diagnose_site","description":"Full GEO/SEO site diagnosis: domain (DNS/TLS cert/WHOIS), transport & server fingerprint (CMS/framework/platform/CDN), robots.txt, sitemap, homepage + representative pages (meta, H1..H6 structure, JSON-LD, OG, images/alt, links, mixed content), performance and security checks. Bootstraps the site on first use (url → site key, dots → underscores).","write_action":false,"price_micros":0,"input_schema":null},{"name":"image_acquire","description":"Auto image pipeline (search → red-line filter → download → WebP crop → upload to WP media library)","write_action":false,"price_micros":0,"input_schema":null},{"name":"juejin_article_delete","description":"Delete a published Juejin article (article/delete). IRREVERSIBLE — pass confirm=true only after verifying the article id","write_action":true,"price_micros":0,"input_schema":null},{"name":"juejin_draft_delete","description":"Delete a Juejin draft (article_draft/delete). IRREVERSIBLE — pass confirm=true only after verifying the draft id via","write_action":true,"price_micros":0,"input_schema":null},{"name":"juejin_status","description":"Read the Juejin (掘金) backend for this site: the draft box (article_draft/list_by_user) and the published list","write_action":false,"price_micros":0,"input_schema":null},{"name":"monitor_report","description":"Read monitoring results (latest round or a given run_id)","write_action":false,"price_micros":0,"input_schema":null},{"name":"monitor_run","description":"Run GEO monitoring (one round of site prompts × models; results persisted)","write_action":true,"price_micros":0,"input_schema":null},{"name":"plan_import","description":"Import/update the plan table from the site plan directory (idempotent)","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan_list","description":"Article plan table list (status/batch/category/node filters)","write_action":false,"price_micros":0,"input_schema":null},{"name":"plan_mark_status","description":"Update a plan row status (todo/written/queued/published/archived)","write_action":true,"price_micros":0,"input_schema":null},{"name":"publish_daily","description":"Run the daily promotion task (promotes due drafts to publish by plan publish_order; default 1/day).","write_action":true,"price_micros":0,"input_schema":null},{"name":"publish_draft","description":"Publish a draft (default draft → WP; can --status=publish directly, must pass the gate first)","write_action":true,"price_micros":0,"input_schema":null},{"name":"publish_from_db","description":"Publish an article from the DB to WordPress (--force updates an existing article)","write_action":true,"price_micros":0,"input_schema":null},{"name":"publish_update_article","description":"Bypass update of an existing article (title/content/status + sync SEO/GEO meta).","write_action":true,"price_micros":0,"input_schema":null},{"name":"report_write","description":"Write a Markdown report into the site data/reports/ directory (path-safe: filename is basenamed and confined to the reports dir). Auto-bootstraps the site on first use.","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_gsc_inspect","description":"Query one URL's Google indexing status (URL Inspection API, read-only): verdict, coverageState,","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_gsc_stats","description":"Read Google Search Console Search Analytics data: clicks / impressions / CTR / average position,","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_submit_baidu","description":"Submit URLs to Baidu normal inclusion (requires BAIDU_TOKEN / BAIDU_SITE).","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_submit_gsc","description":"Submit the sitemap to Google Search Console (soft-fail)","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_submit_indexnow","description":"Submit URLs to IndexNow (requires INDEXNOW_KEY)","write_action":true,"price_micros":0,"input_schema":null},{"name":"site_init","description":"Scaffold a site inside the bound workspace: <workspace>/<key>/{config,data/inbox,data/reports,.env} (idempotent, never overwrites existing files)","write_action":false,"price_micros":0,"input_schema":null},{"name":"site_list","description":"List the sites inside the bound user workspace (site key, domain, app_id, storage driver). Returns a hint instead when no workspace is bound yet.","write_action":false,"price_micros":0,"input_schema":null},{"name":"site_status","description":"Site status: config paths, .env readiness, DB driver and SQLite init state","write_action":false,"price_micros":0,"input_schema":null},{"name":"standards_list","description":"List the generic writing & GEO standards shipped with the engine (titles, whether a site-specific supplement exists).","write_action":false,"price_micros":0,"input_schema":null},{"name":"standards_read","description":"Read a generic standard document (base + any site-specific supplement merged). Names are repository-relative without `.md`,","write_action":false,"price_micros":0,"input_schema":null},{"name":"util_ping","description":"Connectivity self-check: SDK version, driver, internal data directory, bound workspace and site count","write_action":false,"price_micros":0,"input_schema":null},{"name":"webmaster_bing_status","description":"Read Bing Webmaster console data (verified sites / URL submission quota / query stats / crawl issues). Requires BING_WEBMASTER_API_KEY in the site .env. Note: Bing trimmed its JSON API on 2026-08-31 (GetPages/GetSitemaps/GetTrafficStats/GetUrlSubmissionStatus now 404).","write_action":false,"price_micros":0,"input_schema":null},{"name":"webmaster_bing_submit","description":"Write to Bing Webmaster: submit URL(s) (comma-separated = batch, ≤10000 per call). Requires BING_WEBMASTER_API_KEY in the site .env.","write_action":true,"price_micros":0,"input_schema":null},{"name":"wechat_article_delete","description":"Delete a published article (freepublish/delete, article_id from wechat_status published). IRREVERSIBLE — verify the","write_action":true,"price_micros":0,"input_schema":null},{"name":"wechat_draft_publish","description":"Publish a draft box media_id to the account homepage via freepublish/submit (NO push to followers — the draft is","write_action":true,"price_micros":0,"input_schema":null},{"name":"wechat_mass_preview","description":"Send a draft (media_id from the draft box) to one user as a preview (message/mass/preview). Requires a verified","write_action":true,"price_micros":0,"input_schema":null},{"name":"wechat_mass_send","description":"Mass-send (PUSH to followers) a draft via message/mass/sendall (all followers or one tag) or message/mass/send","write_action":true,"price_micros":0,"input_schema":null},{"name":"wechat_mass_status","description":"Query a mass-send task status (message/mass/get, msg_id from wechat_mass_send).","write_action":false,"price_micros":0,"input_schema":null},{"name":"wechat_stats","description":"Read official-account statistics from the WeChat backend (datacube/*, served WITHOUT the /cgi-bin/ prefix —","write_action":false,"price_micros":0,"input_schema":null},{"name":"wechat_status","description":"Read the WeChat official-account backend: the draft box (draft/batchget — media_id + titles) and the mass-sent list","write_action":false,"price_micros":0,"input_schema":null},{"name":"wechat_sync_progress","description":"Reconcile the channel_plan calendar with the real WeChat backend and auto-fix the DB: draft rows whose media_id is","write_action":false,"price_micros":0,"input_schema":null},{"name":"workspace_use","description":"Bind the user workspace directory (call this first): all site config, credentials and output files live under it. Ask the user which directory to use if it was not mentioned; `~` is supported and expanded here.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":89,"grade":"A","scanned_at":"2026-10-02T22:37:28.781Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-02T22:37:28.761Z","components":{"code":{"score":25,"max":25,"notes":["5 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":6,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@tengence/geo-mcp","version":"0.1.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-10-02T15:39:03.234Z","repositoryUrl":"git+https://github.com/tengence-team/tengence-geo-agent.git","weeklyDownloads":370}],"repo":{"found":true,"owner":"tengence-team","repo":"tengence-geo-agent","archived":false,"pushedAt":"2026-10-02T16:03:13Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/214343348?v=4","ownerCreatedAt":"2025-06-01T09:41:12Z","license":"MIT"},"icon":{"url":"https://www.tengence.com/favicon.ico","source":"site","width":69,"height":69},"presence":{"stars":0,"forks":0,"downloadsWeek":370,"license":"MIT","lastPushAt":"2026-10-02T16:03:13.000Z","score":28}}}},"grade_history":[],"reviews":[]}