{"id":111,"date":"2026-09-24T09:57:26","date_gmt":"2026-09-24T09:57:26","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/mcp-server-3\/"},"modified":"2026-09-24T09:57:26","modified_gmt":"2026-09-24T09:57:26","slug":"mcp-server-3","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-multilingual\/mcp-server-3\/","title":{"rendered":"Translating from Claude and ChatGPT (MCP)"},"content":{"rendered":"<p><em>Available in <strong>PRO<\/strong> (version 2.4.0 and later).<\/em><\/p>\n<p>Everywhere else in this plugin, automatic translation means sending your text to an AI provider and<br \/>\npaying that provider for the answer. The MCP server turns that around. You connect your site to the<br \/>\nAI assistant you already use &#8211; Claude or ChatGPT &#8211; and translate from inside the conversation. The<br \/>\nassistant writes the translation; the plugin saves it on your site.<\/p>\n<p><strong>There is no API bill.<\/strong> No key is used, no provider is called, and every translation made this way<br \/>\nshows a cost of $0.00 on the History screen. You are using the subscription you already pay for.<\/p>\n<p>MCP &#8211; Model Context Protocol &#8211; is the standard those assistants use to talk to outside systems.<br \/>\nSwitching the server on gives the assistant a set of tools: find untranslated pages, take one for<br \/>\ntranslation, send the translation back, look something up in your glossary.<\/p>\n<p>In practice a session looks like this:<\/p>\n<blockquote>\n<p><strong>You:<\/strong> What still needs translating into German?<\/p>\n<p><strong>Claude:<\/strong> Eleven pages have no German version. The most recently edited are <em>About<\/em>, <em>Shipping &amp;<br \/>\nReturns<\/em> and <em>Our Suppliers<\/em>.<\/p>\n<p><strong>You:<\/strong> Do the three of them.<\/p>\n<p><strong>Claude:<\/strong> <em>(takes each page, translates it, sends it back)<\/em> All three are translated and live.<br \/>\n<em>About<\/em> is at \/de\/uber-uns\/.<\/p>\n<\/blockquote>\n<h2>What you need before you start<\/h2>\n<ul>\n<li>An active <strong>PRO licence<\/strong>.<\/li>\n<li>At least one language to translate into, under <strong>LATW Multilingual \u2192 Settings \u2192 Languages<\/strong>.<\/li>\n<li><strong>HTTPS.<\/strong> Assistants run on someone else&#8217;s servers and will not connect to an unencrypted site.<\/li>\n<li>A <strong>Claude<\/strong> or <strong>ChatGPT<\/strong> plan that allows custom connectors. On ChatGPT that means Plus, Pro,<br \/>\nBusiness, Enterprise or Edu &#8211; the free tier cannot add one.<\/li>\n<\/ul>\n<p>No AI provider key is needed. The MCP server works whichever engine is selected on the <strong>AI<\/strong> tab,<br \/>\nand also when none is set up at all.<\/p>\n<h2>Switching it on<\/h2>\n<ol>\n<li>Go to <strong>LATW Multilingual \u2192 Settings \u2192 MCP<\/strong>.<\/li>\n<li>Turn on <strong>MCP server<\/strong>.<\/li>\n<li>Press <strong>Generate token<\/strong>. The token is the password to this door &#8211; anyone holding it can read and<br \/>\ntranslate your site&#8217;s content.<\/li>\n<li>Decide what the assistant may reach, under <strong>What the assistant may do<\/strong>. Posts and pages are<br \/>\nalways available. Status and costs, and the glossary, are on by default; interface strings and<br \/>\ncategories and tags are off until you want them.<\/li>\n<li>Press <strong>Save changes<\/strong>, then <strong>Test connection<\/strong>. That check calls the server the same way an<br \/>\nassistant would and tells you plainly if something between the internet and WordPress is in the<br \/>\nway.<\/li>\n<\/ol>\n<p>The screen then shows two addresses. Which one you use depends on the application.<\/p>\n<h2>Connecting Claude<\/h2>\n<p><strong>Claude Desktop and claude.ai.<\/strong> Open <strong>Settings \u2192 Connectors \u2192 Add custom connector<\/strong>, give it a<br \/>\nname, and paste the <strong>Address (token in URL)<\/strong> from the MCP tab. Press <strong>Show<\/strong> next to the field<br \/>\nfirst &#8211; the screen masks it until you do &#8211; or press <strong>Copy<\/strong>, which always copies the full address.<br \/>\nThere is nothing else to fill in: the token is part of the address.<\/p>\n<p><strong>Claude Code.<\/strong> The MCP tab shows the exact command, ready to copy:<\/p>\n<pre><code>claude mcp add my-site https:\/\/example.com\/wp-json\/latwmp-mcp\/v1\/http --transport http --header \"Authorization: Bearer YOUR_TOKEN\"<\/code><\/pre>\n<p>Run it in a terminal, then <code>\/mcp<\/code> inside Claude Code to confirm the site is listed.<\/p>\n<h2>Connecting ChatGPT<\/h2>\n<p>Custom connectors are hidden until you switch developer mode on, so this is two trips into Settings.<\/p>\n<p><strong>First, switch developer mode on.<\/strong> Open <strong>Settings \u2192 Security and login<\/strong>, find <strong>Developer mode<\/strong><br \/>\nand turn it on.<\/p>\n<p><strong>Then add the connector.<\/strong> Open <strong>Settings \u2192 Plugins \u2192 Browse plugins<\/strong> and press the <strong>+<\/strong> in the<br \/>\ntop right corner. Fill the form in:<\/p>\n<ul>\n<li><strong>Name<\/strong> &#8211; whatever you want to see in the conversation, for example your site&#8217;s name.<\/li>\n<li><strong>Address<\/strong> &#8211; the <strong>Address (token in URL)<\/strong> from the MCP tab.<\/li>\n<li><strong>Authentication<\/strong> &#8211; <strong>No Auth<\/strong>. The token is already part of the address, so there is nothing<br \/>\nelse to fill in.<\/li>\n<li>Tick <strong>I understand and want to continue<\/strong>, then press <strong>Create<\/strong>.<\/li>\n<\/ul>\n<p>ChatGPT loads the connector, which takes a moment, and then shows <strong>Connect<\/strong>. Press it, and the<br \/>\nsite&#8217;s tools are available in the conversation.<\/p>\n<h2>Asking for a translation<\/h2>\n<p>Once connected, ask in plain language. The assistant has the tools; you do not need to name them.<\/p>\n<ul>\n<li><em>&#8220;What pages have no French translation yet?&#8221;<\/em><\/li>\n<li><em>&#8220;Translate the About page into German and French.&#8221;<\/em><\/li>\n<li><em>&#8220;The pricing page changed &#8211; update the Polish version.&#8221;<\/em><\/li>\n<li><em>&#8220;How much have translations cost this month?&#8221;<\/em><\/li>\n<li><em>&#8220;Show me the German version of the pricing page &#8211; does it read naturally?&#8221;<\/em><\/li>\n<li><em>&#8220;The Polish About page says &#8216;Zacznij zakupy&#8217; on the button. Change it to &#8216;Przejd\u017a do zakup\u00f3w&#8217;.&#8221;<\/em><\/li>\n<li><em>&#8220;What was the last thing translated on the shop?&#8221;<\/em><\/li>\n<li><em>&#8220;Change the Polish address of the About page to o-nas-firmy.&#8221;<\/em><\/li>\n<li><em>&#8220;Translate the main menu and the contact form into German.&#8221;<\/em> (needs <strong>Interface strings<\/strong>)<\/li>\n<li><em>&#8220;Translate the product categories into Polish.&#8221;<\/em> (needs <strong>Categories and tags<\/strong>)<\/li>\n<\/ul>\n<p>The translation is saved exactly where the plugin&#8217;s own automatic translation would have saved it.<br \/>\nIt appears in <strong>LATW Multilingual \u2192 History<\/strong> &#8211; with the assistant&#8217;s name in the <strong>Method<\/strong> column &#8211;<br \/>\non the <strong>Posts<\/strong> screen and on the front end, and you can edit it afterwards like any other<br \/>\ntranslation, from the <strong>LATW Translations<\/strong> box on the page&#8217;s edit screen.<\/p>\n<p>Which content types and taxonomies can be translated is decided by<br \/>\n<strong>LATW Multilingual \u2192 Settings \u2192 Translation<\/strong>, the same as for every other way of translating.<\/p>\n<h3>What the assistant is handed<\/h3>\n<p>The same text the automatic translation would send: the title, the content, the excerpt, the<br \/>\ntranslated custom fields and &#8211; on an Elementor page &#8211; the text of each widget, never the layout<br \/>\nitself. Block settings inside the content are replaced by placeholders the assistant has to copy<br \/>\nback unchanged, so a translation cannot break a block&#8217;s styling.<\/p>\n<p>Your <strong>Website Description<\/strong>, your <strong>Translation Prompt<\/strong> (when you have written your own) and your<br \/>\nglossary go with every job, as guidance for the assistant.<\/p>\n<p>Pages built with WPBakery, Divi and the other page builders that are translated by hand only are<br \/>\nnot offered &#8211; the same rule as for automatic translation.<\/p>\n<h2>Reviewing and correcting a translation<\/h2>\n<p>You do not have to accept a translation as it came out, and you do not have to redo the whole page<br \/>\nto change one line.<\/p>\n<p>Ask to see it, and the assistant reads the current translation field by field beside the original:<\/p>\n<blockquote>\n<p><strong>You:<\/strong> Show me the Polish About page next to the original.<\/p>\n<p><strong>Claude:<\/strong> <em>(lists each piece)<\/em> The heading is &#8220;O nas&#8221;, the intro is \u2026, the button says &#8220;Zacznij<br \/>\nzakupy&#8221;.<\/p>\n<p><strong>You:<\/strong> The button should say &#8220;Przejd\u017a do zakup\u00f3w&#8221;.<\/p>\n<p><strong>Claude:<\/strong> Changed. The rest of the page is untouched.<\/p>\n<\/blockquote>\n<p>Only the line you asked about is rewritten. Everything else keeps the wording it already had,<br \/>\nincluding any corrections you made by hand.<\/p>\n<p>Three things are worth knowing:<\/p>\n<ul>\n<li><strong>A first translation is all-or-nothing.<\/strong> Until a page has a translation, every field has to be<br \/>\nfilled in one go &#8211; there is nothing to keep for the ones left out. The assistant is told this and<br \/>\nwill not half-translate a page by accident.<\/li>\n<li><strong>Outdated stays outdated.<\/strong> When the original has changed since it was translated, the assistant<br \/>\ncan be asked to translate only what changed. A part it leaves alone keeps its old translation and<br \/>\nstays marked as out of date, so it still shows up on the <strong>Posts<\/strong> screen as needing an update.<\/li>\n<li><strong>A mistake is sent back, not saved.<\/strong> The assistant&#8217;s answer goes through the same checks as an<br \/>\nautomatic translation &#8211; no block, shortcode or placeholder may go missing. If one does, nothing is<br \/>\nsaved, the assistant is told which field is wrong, and it can correct it and send it again.<\/li>\n<\/ul>\n<h2>Addresses of translated pages<\/h2>\n<p>When the <strong>Localize URLs (slug)<\/strong> setting is on, a translated page gets an address built from its<br \/>\ntranslated title, so <em>About<\/em> becomes <code>\/pl\/o-nas\/<\/code> on its own. That is usually what you want, and<br \/>\noccasionally not &#8211; a title that translates to the same words, or a page whose heading and address<br \/>\nshould read differently.<\/p>\n<p>You can ask for a different one, either while translating or long afterwards:<\/p>\n<blockquote>\n<p><strong>You:<\/strong> Translate the About page into Polish, and make the address \/pl\/o-nas-firmy\/.<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>You:<\/strong> Change the Polish address of the About page to poznaj-nasza-firme.<\/p>\n<\/blockquote>\n<p>Only that language&#8217;s address changes. The original page keeps its own address, and so does every<br \/>\nother language. If the address you ask for is already used by another page in that language, a<br \/>\nnumber is appended and the assistant tells you which address it actually got.<\/p>\n<p><strong>The previous address stops working.<\/strong> The plugin does not keep old addresses of a translation, so<br \/>\nonce a published translation is given a new one, any link pointing at the old address lands on a<br \/>\n404. If the page was already published and linked to, add a redirect yourself.<\/p>\n<h2>What it will not do<\/h2>\n<p>Be clear about this before you promise it to anyone:<\/p>\n<ul>\n<li><strong>It is not bulk translation.<\/strong> The assistant works page by page, in a conversation, and long<br \/>\npages use up a lot of it. For two hundred products, use automatic translation and pay the API<br \/>\nbill &#8211; that is what it is for. This is for the pages you care about individually.<\/li>\n<li><strong>The quality is the assistant&#8217;s, not the plugin&#8217;s.<\/strong> Your <strong>Translation Prompt<\/strong> and <strong>Website<br \/>\nDescription<\/strong> are handed over as guidance, but nothing enforces them. An assistant that decides to<br \/>\nparaphrase will paraphrase.<\/li>\n<li><strong>The glossary is advice here, not a rule.<\/strong> Your terms are sent with every job and assistants<br \/>\nfollow them well, but the plugin cannot check the result.<\/li>\n<li><strong>A conversation can stop halfway.<\/strong> If it does, the page is left with an open job. Ask the<br \/>\nassistant to <em>&#8220;list open translation jobs&#8221;<\/em> and either finish or cancel them; open jobs also show<br \/>\nas <code>awaiting_mcp<\/code> on the History screen. An open job changes nothing on the site.<\/li>\n<li><strong>One token for the whole site.<\/strong> There is no per-person access and no list of connected<br \/>\napplications. Generating a new token disconnects everything using the old one.<\/li>\n<li><strong>Theme and plugin files are not included.<\/strong> Texts translated on the <strong>Themes &amp; Plugins<\/strong> screen<br \/>\nare not offered to the assistant.<\/li>\n<\/ul>\n<h2>About the token<\/h2>\n<p>The token is shown masked, and <strong>Show<\/strong> reveals it &#8211; you will need to read it back when you connect<br \/>\na second application.<\/p>\n<p>The two addresses differ in more than convenience. The one with the token in the URL is the easy<br \/>\none, and it is what Claude Desktop and ChatGPT need, but a secret in an address ends up in your<br \/>\nserver&#8217;s access logs and in the browser history of whoever pasted it. The address using the<br \/>\n<code>Authorization<\/code> header keeps the token out of both, and is worth using wherever the application<br \/>\nsupports it.<\/p>\n<p>Either way: treat the token like an administrator password, and press <strong>Generate a new token<\/strong> the<br \/>\nmoment you think someone else has seen it.<\/p>\n<p>The connected assistant acts as the WordPress user who generated the token, with that user&#8217;s<br \/>\npermissions. If that account is deleted or loses its administrator role, the token stops working.<\/p>\n<h2>When something goes wrong<\/h2>\n<p><strong>Test connection<\/strong> on the MCP tab is the first thing to try &#8211; it separates &#8220;the plugin is fine and<br \/>\nyour assistant is misconfigured&#8221; from &#8220;nothing can reach this site at all&#8221;.<\/p>\n<table>\n<thead>\n<tr>\n<th>What you see<\/th>\n<th>What it usually means<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>The assistant says it cannot reach the server<\/td>\n<td>The address is wrong, the server is switched off, or the site is not on HTTPS.<\/td>\n<\/tr>\n<tr>\n<td>Test connection says the token did not arrive<\/td>\n<td>Your host strips the <code>Authorization<\/code> header before PHP sees it. Use the address with the token in the URL instead.<\/td>\n<\/tr>\n<tr>\n<td>Test connection cannot reach the site at all<\/td>\n<td>A firewall or a security plugin is blocking <code>\/wp-json\/<\/code>. Allow <code>\/wp-json\/latwmp-mcp\/<\/code> through.<\/td>\n<\/tr>\n<tr>\n<td>A 404 from the address<\/td>\n<td>The server is switched off.<\/td>\n<\/tr>\n<tr>\n<td>A 403 from the address<\/td>\n<td>The licence is not active &#8211; or, on the address with the token in it, the site is not on HTTPS.<\/td>\n<\/tr>\n<tr>\n<td>A 401<\/td>\n<td>The token is wrong &#8211; copy it again from the MCP tab.<\/td>\n<\/tr>\n<tr>\n<td>The assistant lists no tools, or fewer than expected<\/td>\n<td>A tool group is switched off under <strong>What the assistant may do<\/strong>, or the licence expired.<\/td>\n<\/tr>\n<tr>\n<td>Rows stuck at <code>awaiting_mcp<\/code><\/td>\n<td>A conversation ended mid-job. Ask the assistant to list and cancel open jobs.<\/td>\n<\/tr>\n<tr>\n<td>&#8220;An automatic translation \u2026 is already running&#8221;<\/td>\n<td>The page is in the automatic translation queue for that language. Wait for it to finish, or cancel it from the queue panel.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The <strong>LATW Multilingual \u2192 Logs<\/strong> page records what happened on this site&#8217;s side, and<br \/>\n<strong>Settings \u2192 Advanced \u2192 Debug Mode<\/strong> adds the detail.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Available in PRO (version 2.4.0 and later). Everywhere else in this plugin, automatic translation means sending your text to an AI provider and paying that provider\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_latwm_translated_slug":"","footnotes":""},"categories":[4],"tags":[],"class_list":["post-111","post","type-post","status-publish","format-standard","hentry","category-latw-multilingual"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/comments?post=111"}],"version-history":[{"count":1,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/111\/revisions"}],"predecessor-version":[{"id":116,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/111\/revisions\/116"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}