@xiedada/nodemw-mcp-server 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
27
27
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
28
28
|
*/
|
|
29
|
-
import{StdioServerTransport as
|
|
29
|
+
import{StdioServerTransport as Ze}from"@modelcontextprotocol/sdk/server/stdio.js";import{parseArgs as to}from"util";import{McpServer as ne}from"@modelcontextprotocol/sdk/server/mcp.js";var K="nodemw-mcp-server/1.0";function Z(e,t=!1){let o,r=t?" Write operations are available.":" Running in guest mode \u2014 only read operations are available.";return e?o=`Connected to ${e.sitename} (${e.base}). Running ${e.generator}.${r} When connecting for the first time, call the get-site-info tool for full site details.`:o=`When connecting to this server for the first time, call the get-site-info tool to understand the target MediaWiki site (version, namespaces, extensions, etc.) before using other tools.${r}`,new ne({name:"nodemw-mcp-server",version:"1.0.0",description:o},{capabilities:{tools:{}}})}import{z as q}from"zod";import se from"nodemw";var F=null,ie=null,tt=!1;function et(e){ie=e}function ot(e){let{server:t,path:o,protocol:r,port:a,proxy:c,userAgent:m,concurrency:p,debug:u,username:g,password:M,domain:U,dryRun:D}=e;return new se({server:t,protocol:r||"https",port:a,path:o,proxy:c,userAgent:m||K,concurrency:p,debug:u,username:g||void 0,password:M||void 0,domain:U,dryRun:D})}async function le(e){try{return await s(e,"getSiteInfo",["general"]),!0}catch{return!1}}async function rt(e){let t=["/w",""];for(let o of t){let r={...e,path:o},a=ot(r);if(await le(a))return o}throw new Error('Could not auto-detect MediaWiki API path. Tried /w/api.php and /api.php. Please specify --path explicitly (e.g., --path /w or --path "" for root).')}async function nt(e){F=ot(e);let{username:t,password:o}=e;return t&&o&&await new Promise((r,a)=>{F.logIn(c=>{c?a(new Error(`Login failed for user '${t}': ${c.message}`)):(tt=!0,r())})}),F}function n(){if(!F)throw new Error("Bot not initialized. Server must be started first.");return F}function st(){return tt}function s(e,t,...o){return new Promise((r,a)=>{let c=(m,p)=>{m?a(m):r(p)};e[t](...o,c)})}function it(e){return e.tool("get-article","Retrieve the content of a wiki article",{title:q.string().describe("Article title"),followRedirect:q.boolean().optional().default(!0).describe("Follow redirects"),redirectInfo:q.boolean().optional().default(!1).describe("Include information about redirects")},{title:"Get article",readOnlyHint:!0,destructiveHint:!1},async({title:t,followRedirect:o,redirectInfo:r})=>ae(t,o,r))}async function ae(e,t,o){try{let r=await n();if(o){let a=await new Promise((u,g)=>{let M=(U,D,re)=>{U?g(U):u([D,re])};r.getArticle(e,t,M)}),[c,m]=a;return c==null?{content:[{type:"text",text:`Page "${e}" not found or has no content.`}],isError:!0}:{content:[{type:"text",text:m?`Content:
|
|
30
30
|
|
|
31
31
|
${c}
|
|
32
32
|
|
|
33
33
|
Redirect Information:
|
|
34
34
|
|
|
35
|
-
${JSON.stringify(m,null,2)}`:c}]}}else{let a=await i(r,"getArticle",t,e);return a==null?{content:[{type:"text",text:`Page "${t}" not found or has no content.`}],isError:!0}:{content:[{type:"text",text:a}]}}}catch(r){return{content:[{type:"text",text:`Error: ${r.message}`}],isError:!0}}}import{z as q}from"zod";function l(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function s(t,e){return{content:[{type:"text",text:JSON.stringify({error:t,details:e?.message},null,2)}],isError:!0}}function _(t){return t.tool("search","Search for wiki pages by keyword",{keyword:q.string().describe("Search keyword"),limit:q.number().optional().default(10).describe("Maximum number of results")},{title:"Search",readOnlyHint:!0,destructiveHint:!1},async({keyword:e,limit:o})=>Xt(e,o))}async function Xt(t,e){try{let o=await n(),r=await i(o,"search",t),a=r.slice(0,e);return l({total:r.length,limit:e,keyword:t,results:a})}catch(o){return s("Failed to search",o)}}import{z as Kt}from"zod";function Q(t){return t.tool("get-pages-in-category","Get all pages in a category",{category:Kt.string().describe("Category name (with or without Category: prefix)")},{title:"Get pages in category",readOnlyHint:!0,destructiveHint:!1},async({category:e})=>Zt(e))}async function Zt(t){try{let e=await n(),o=t.replace(/^Category:/i,""),r=await i(e,"getPagesInCategory",o);return l({category:o,pages:r,count:r.length})}catch(e){return s("Failed to get pages in category",e)}}import{z as te}from"zod";function V(t){return t.tool("get-categories","Get all categories matching a prefix",{prefix:te.string().optional().default("").describe("Prefix to filter categories")},{title:"Get categories",readOnlyHint:!0,destructiveHint:!1},async({prefix:e})=>ee(e))}async function ee(t){try{let e=await n(),o=await i(e,"getCategories",t);return l({prefix:t,categories:o,count:o.length})}catch(e){return s("Failed to get categories",e)}}import{z as Y}from"zod";function J(t){return t.tool("get-users","Get all users matching a prefix",{prefix:Y.string().optional().default("").describe("Prefix to filter usernames"),onlyWithEdits:Y.boolean().optional().default(!1).describe("Only include users with at least one edit")},{title:"Get users",readOnlyHint:!0,destructiveHint:!1},async({prefix:e,onlyWithEdits:o})=>oe(e,o))}async function oe(t,e){try{let o=await n(),r=await i(o,"getUsers",{prefix:t,witheditsonly:e});return l({prefix:t,onlyWithEdits:e,users:r,count:r.length})}catch(o){return s("Failed to get users",o)}}import{z as re}from"zod";function X(t){return t.tool("get-all-pages","Get all non-redirect pages from the wiki",{limit:re.number().optional().default(500).describe("Maximum number of pages to return")},{title:"Get all pages",readOnlyHint:!0,destructiveHint:!1},async({limit:e})=>ne(e))}async function ne(t){try{let e=await n(),o=await i(e,"getAllPages"),r=o.slice(0,t);return l({total:o.length,displayed:r.length,pages:r,limit:t})}catch(e){return s("Failed to get all pages",e)}}import{z as ie}from"zod";function K(t){return t.tool("get-pages-in-namespace","Get all non-redirect pages in a specific namespace",{namespace:ie.number().describe("Namespace number to filter pages")},{title:"Get pages in namespace",readOnlyHint:!0,destructiveHint:!1},async({namespace:e})=>se(e))}async function se(t){try{let e=await n(),o=await i(e,"getPagesInNamespace",t);return l({namespace:t,pages:o,count:o.length})}catch(e){return s("Failed to get pages in namespace",e)}}import{z as le}from"zod";function Z(t){return t.tool("get-pages-by-prefix","Get pages starting with a specific prefix",{prefix:le.string().describe("Prefix to match page titles")},{title:"Get pages by prefix",readOnlyHint:!0,destructiveHint:!1},async({prefix:e})=>ae(e))}async function ae(t){try{let e=await n(),o=await i(e,"getPagesByPrefix",t);return l({prefix:t,pages:o,count:o.length})}catch(e){return s("Failed to get pages by prefix",e)}}import{z as ce}from"zod";function tt(t){return t.tool("get-pages-transcluding","Get all pages that transclude (include) a specific template",{template:ce.string().describe("Template title to find transclusions")},{title:"Get pages transcluding template",readOnlyHint:!0,destructiveHint:!1},async({template:e})=>me(e))}async function me(t){try{let e=await n(),r=(await i(e,"getPagesTranscluding",t))[1],a=Array.isArray(r)?r.filter(c=>c!=null&&typeof c=="object"&&"title"in c):[];return l({template:t,pages:a,count:a.length})}catch(e){return s("Failed to get pages transcluding template",e)}}import{z as w}from"zod";function et(t){return t.tool("get-article-revisions","Get all revisions of a wiki article",{title:w.union([w.string(),w.number()]).describe("Article title or page ID")},{title:"Get article revisions",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>pe(e))}async function pe(t){try{let e=await n(),r=(await i(e,"getArticleRevisions",t)).flat();return l({title:t,revisions:r,count:r.length})}catch(e){return s("Failed to get article revisions",e)}}import{z as k}from"zod";function ot(t){return t.tool("get-article-categories","Get all categories that an article belongs to",{title:k.union([k.string(),k.number()]).describe("Article title or page ID")},{title:"Get article categories",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>ue(e))}async function ue(t){try{let e=await n(),o=await i(e,"getArticleCategories",t);return l({title:t,categories:o,count:o.length})}catch(e){return s("Failed to get article categories",e)}}import{z as ge}from"zod";function rt(t){return t.tool("get-article-properties","Get page properties for a wiki article",{title:ge.string().describe("Article title")},{title:"Get article properties",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>de(e))}async function de(t){try{let e=await n(),o=await i(e,"getArticleProperties",t);return l({title:t,properties:o})}catch(e){return s("Failed to get article properties",e)}}import{z as d}from"zod";function nt(t){return t.tool("get-article-info","Get detailed information about one or more articles",{title:d.union([d.string(),d.number(),d.array(d.union([d.string(),d.number()]))]).describe("Article title, page ID, or array of titles/IDs"),properties:d.array(d.string()).optional().describe("Specific properties to retrieve")},{title:"Get article info",readOnlyHint:!0,destructiveHint:!1},async({title:e,properties:o})=>fe(e,o))}async function fe(t,e){try{let o=await n(),a=await i(o,"getArticleInfo",t,e?{inprop:e}:{}),c=Array.isArray(a)?a:[a];return l({title:t,results:c,count:c.length})}catch(o){return s("Failed to get article info",o)}}import{z as A}from"zod";function it(t){return t.tool("get-user-contribs","Get contributions made by a specific user",{username:A.string().describe("Username to get contributions for"),namespace:A.number().optional().describe("Filter contributions by namespace"),limit:A.number().optional().default(50).describe("Maximum number of contributions to return")},{title:"Get user contributions",readOnlyHint:!0,destructiveHint:!1},async({username:e,namespace:o,limit:r})=>ye(e,o,r))}async function ye(t,e,o=50){try{let r=await n(),a={user:t,...e!==void 0&&{namespace:e}},c=await i(r,"getUserContribs",a),m=Array.isArray(c[1])?c[1]:[],p=m.slice(0,o);return l({username:t,namespace:e,limit:o,total:m.length,displayed:p.length,contributions:p})}catch(r){return s("Failed to get user contributions",r)}}function st(t){return t.tool("whoami","Get information about the currently logged in user",{},{title:"Who am I",readOnlyHint:!0,destructiveHint:!1},async()=>Te())}async function Te(){try{let t=await n(),e=await i(t,"whoami");return l(e)}catch(t){return s("Failed to get current user info",t)}}import{z as Re}from"zod";function lt(t){return t.tool("whois","Get information about a specific user",{username:Re.string().describe("Username to look up")},{title:"Whois",readOnlyHint:!0,destructiveHint:!1},async({username:e})=>he(e))}async function he(t){try{let e=await n(),o=await i(e,"whois",t);return o.missing?s(`User "${t}" not found.`):l(o)}catch(e){return s("Failed to get user info",e)}}import{z as at}from"zod";function ct(t){return t.tool("whoare","Get information about multiple wiki users",{usernames:at.array(at.string()).describe("Array of usernames to query")},{title:"Who are",readOnlyHint:!0,destructiveHint:!1},async e=>be(e))}async function be(t){try{let e=await n(),o=await i(e,"whoare",t.usernames);return l(o)}catch(e){return s("Failed to get user information",e)}}import{z as mt}from"zod";function pt(t){return t.tool("get-images","Get list of images starting from a specific name",{startFrom:mt.string().optional().default("").describe("Start from this image name"),limit:mt.number().optional().default(50).describe("Maximum number of images to return")},{title:"Get images",readOnlyHint:!0,destructiveHint:!1},async({startFrom:e,limit:o})=>xe(e,o))}async function xe(t,e){try{let o=await n(),r=await new Promise((c,m)=>{o.getImages(t,(p,...u)=>{if(p)m(p);else{let g=u[0];c(Array.isArray(g)?g:[])}})}),a=r.slice(0,e);return l({total:r.length,limit:e,startFrom:t,images:a})}catch(o){return s("Failed to get images",o)}}import{z as M}from"zod";function ut(t){return t.tool("get-images-from-article","Get all images embedded in a specific article",{title:M.union([M.string(),M.number()]).describe("Article title or page ID")},{title:"Get images from article",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>ve(e))}async function ve(t){try{let e=await n(),o=await i(e,"getImagesFromArticle",t);return l({title:t,images:o,count:o.length})}catch(e){return s("Failed to get images from article",e)}}import{z as we}from"zod";function gt(t){return t.tool("get-image-usage","Get all pages that use a specific image",{filename:we.string().describe("Image filename with File: prefix")},{title:"Get image usage",readOnlyHint:!0,destructiveHint:!1},async({filename:e})=>ke(e))}async function ke(t){try{let e=await n(),o=await i(e,"getImageUsage",t);return l({filename:t,pages:o,count:o.length})}catch(e){return s("Failed to get image usage",e)}}import{z as Ae}from"zod";function dt(t){return t.tool("get-image-info","Get detailed information about an image file",{filename:Ae.string().describe("Image filename with File: prefix")},{title:"Get image info",readOnlyHint:!0,destructiveHint:!1},async({filename:e})=>Me(e))}async function Me(t){try{let e=await n(),o=await i(e,"getImageInfo",t);return o?l({filename:t,info:o}):s(`Image "${t}" not found.`)}catch(e){return s("Failed to get image info",e)}}import{z as S}from"zod";function ft(t){return t.tool("get-log","Get log entries of a specific type",{type:S.string().describe("Log type (e.g. delete, block, move)"),start:S.string().optional().default("").describe("Start timestamp (YYYYMMDDHHMMSS format)"),limit:S.number().optional().default(50).describe("Maximum number of entries to return")},{title:"Get log entries",readOnlyHint:!0,destructiveHint:!1},async({type:e,start:o,limit:r})=>Se(e,o,r))}async function Se(t,e,o){try{let r=await n(),a=await new Promise((m,p)=>{r.getLog(t,e,(u,...g)=>{if(u)p(u);else{let y=g[0];m(Array.isArray(y)?y:[])}})}),c=a.slice(0,o);return l({type:t,start:e,limit:o,total:a.length,displayed:c.length,entries:c})}catch(r){return s("Failed to get log entries",r)}}import{z as yt}from"zod";function Tt(t){return t.tool("expand-templates","Expand templates in wikitext",{text:yt.string().describe("Wikitext with templates to expand"),title:yt.string().optional().describe("Context page title")},{title:"Expand templates",readOnlyHint:!0,destructiveHint:!1},async({text:e,title:o})=>Ce(e,o))}async function Ce(t,e){try{let o=await n(),r=await i(o,"expandTemplates",t,e||"");return r==null?{content:[{type:"text",text:`Failed to expand templates for "${t}".`}],isError:!0}:{content:[{type:"text",text:r}]}}catch(o){return{content:[{type:"text",text:`Error: ${o.message}`}],isError:!0}}}import{z as Rt}from"zod";function ht(t){return t.tool("parse","Parse wikitext to HTML",{text:Rt.string().describe("Wikitext to parse"),title:Rt.string().optional().describe("Context page title")},{title:"Parse wikitext",readOnlyHint:!0,destructiveHint:!1},async({text:e,title:o})=>Pe(e,o))}async function Pe(t,e){try{let o=await n(),r=await i(o,"parse",t,e||""),a=r[1]||"",c=Array.isArray(r[2])?r[2]:[];return{content:[{type:"text",text:["Parsed XML structure:","",a,"",`Images found: ${c.length>0?c.join(", "):"none"}`].join(`
|
|
36
|
-
`)}]}}catch(o){return{content:[{type:"text",text:`Error: ${o.message}`}],isError:!0}}}import{z as bt}from"zod";function xt(t){return t.tool("get-recent-changes","Get recent changes on the wiki",{start:bt.string().optional().describe("Start timestamp"),limit:bt.number().optional().default(50).describe("Maximum number of changes to return")},{title:"Get recent changes",readOnlyHint:!0,destructiveHint:!1},async({start:e,limit:o})=>je(e,o))}async function je(t,e=50){try{let o=await n(),r=await new Promise((c,m)=>{o.getRecentChanges(t,(p,...u)=>{if(p)m(p);else{let g=u[0];c(Array.isArray(g)?g:[])}})}),a=r.slice(0,e);return l({total:r.length,limit:e,start:t,changes:a})}catch(o){return s("Failed to get recent changes",o)}}import{z as vt}from"zod";function wt(t){return t.tool("get-site-info","Get site information from MediaWiki",{properties:vt.array(vt.string()).describe("List of site information properties to retrieve")},{title:"Get site info",readOnlyHint:!0,destructiveHint:!1},async({properties:e})=>Be(e))}async function Be(t){try{let e=await n(),o=await i(e,"getSiteInfo",t);return l(o||{})}catch(e){return s("Failed to get site info",e)}}function kt(t){return t.tool("get-site-stats","Get site statistics",{},{title:"Get site stats",readOnlyHint:!0,destructiveHint:!1},async()=>Ee())}async function Ee(){try{let t=await n(),e=await i(t,"getSiteStats");return l(e)}catch(t){return s("Failed to get site stats",t)}}function At(t){return t.tool("get-mediawiki-version","Get MediaWiki version running on the server",{},{title:"Get MediaWiki version",readOnlyHint:!0,destructiveHint:!1},async()=>He())}async function He(){try{let t=await n(),e=await i(t,"getMediaWikiVersion");return l({version:e})}catch(t){return s("Failed to get MediaWiki version",t)}}import{z as Ie}from"zod";function Mt(t){return t.tool("get-query-page","Get results from a query page (special page)",{name:Ie.string().describe("Name of the query page")},{title:"Get query page results",readOnlyHint:!0,destructiveHint:!1},async({name:e})=>Ge(e))}async function Ge(t){try{let e=await n(),o=await i(e,"getQueryPage",t);return l({name:t,results:o,count:o.length})}catch(e){return s("Failed to get query page results",e)}}import{z as C}from"zod";function St(t){return t.tool("get-external-links","Get all external links from an article",{title:C.union([C.string(),C.number()]).describe("Article title or page ID")},{title:"Get external links",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>Fe(e))}async function Fe(t){try{let e=await n(),o=await i(e,"getExternalLinks",t);return l({title:t,links:o.map(r=>r["*"]),count:o.length})}catch(e){return s("Failed to get external links",e)}}import{z as Oe}from"zod";function Ct(t){return t.tool("get-backlinks","Get all backlinks to a specific page",{title:Oe.string().describe("Target page title to find backlinks for")},{title:"Get backlinks",readOnlyHint:!0,destructiveHint:!1},async({title:e})=>Ue(e))}async function Ue(t){try{let e=await n(),o=await i(e,"getBacklinks",t);return l({target:t,backlinks:o,count:o.length})}catch(e){return s("Failed to get backlinks",e)}}import{z as h}from"zod";function Pt(t){return t.tool("edit","Edit a wiki page (requires authentication)",{title:h.string().describe("Page title to edit"),content:h.string().describe("New content for the page"),summary:h.string().describe("Edit summary"),minor:h.boolean().optional().default(!1).describe("Mark as minor edit")},{title:"Edit page",readOnlyHint:!1,destructiveHint:!0},async e=>ze(e))}async function ze(t){try{let e=await n(),o=`[nodemw-mcp] ${t.summary}`,r=await i(e,"edit",t.title,t.content,o,t.minor||!1);return l(r)}catch(e){return s("Failed to edit page",e)}}import{z as P}from"zod";function jt(t){return t.tool("append","Append content to a wiki page (requires authentication)",{title:P.string().describe("Page title"),content:P.string().describe("Content to append"),summary:P.string().describe("Edit summary")},{title:"Append to page",readOnlyHint:!1,destructiveHint:!0},async e=>We(e))}async function We(t){try{let e=await n(),o=`[nodemw-mcp] ${t.summary}`;return await i(e,"append",t.title,t.content,o),l({success:!0,title:t.title})}catch(e){return s("Failed to append to page",e)}}import{z as j}from"zod";function Bt(t){return t.tool("prepend","Prepend content to a wiki page (requires authentication)",{title:j.string().describe("Page title to prepend to"),content:j.string().describe("Content to prepend"),summary:j.string().describe("Edit summary")},{title:"Prepend to page",readOnlyHint:!1,destructiveHint:!0},async e=>$e(e))}async function $e(t){try{let e=await n(),o=`[nodemw-mcp] ${t.summary}`,r=await i(e,"prepend",t.title,t.content,o);return l(r)}catch(e){return s("Failed to prepend to page",e)}}import{z as B}from"zod";function Et(t){return t.tool("move","Move (rename) a wiki page (requires authentication)",{from:B.string().describe("Current page title"),to:B.string().describe("New page title"),summary:B.string().describe("Move summary")},{title:"Move page",readOnlyHint:!1,destructiveHint:!0},async e=>Ne(e))}async function Ne(t){try{let e=await n(),o=`[nodemw-mcp] ${t.summary}`,r=await i(e,"move",t.from,t.to,o);return l(r)}catch(e){return s("Failed to move page",e)}}import{z as Ht}from"zod";function It(t){return t.tool("delete","Delete a wiki page (requires authentication)",{title:Ht.string().describe("Page title to delete"),reason:Ht.string().describe("Reason for deletion")},{title:"Delete page",readOnlyHint:!1,destructiveHint:!0},async e=>Le(e))}async function Le(t){try{let e=await n(),o=`[nodemw-mcp] ${t.reason}`,r=await i(e,"delete",t.title,o);return l(r)}catch(e){return s("Failed to delete page",e)}}import{z as f}from"zod";function Gt(t){return t.tool("protect","Protect a wiki page (requires authentication)",{title:f.string().describe("Page title to protect"),protections:f.array(f.object({type:f.string().describe("Action type (e.g., edit, move)"),level:f.string().optional().default("all").describe("Protection level (e.g., sysop, autoconfirmed)"),expiry:f.string().optional().describe("Expiry time (e.g., 1 week, never)")})).describe("Protection settings"),reason:f.string().optional().describe("Reason for protection"),cascade:f.boolean().optional().default(!1).describe("Apply cascade protection")},{title:"Protect page",readOnlyHint:!1,destructiveHint:!0},async e=>De(e))}async function De(t){try{let e=await n(),o={};t.reason&&(o.reason=`[nodemw-mcp] ${t.reason}`),t.cascade&&(o.cascade=t.cascade);let r=await i(e,"protect",t.title,t.protections,o);return l(r)}catch(e){return s("Failed to protect page",e)}}import{z as b}from"zod";function Ft(t){return t.tool("purge","Purge cache for wiki pages",{titles:b.union([b.string(),b.array(b.string())]).describe("Page title(s) or category to purge")},{title:"Purge pages",readOnlyHint:!1,destructiveHint:!1},async e=>qe(e))}async function qe(t){try{let e=await n(),o=await i(e,"purge",t.titles);return l(o)}catch(e){return s("Failed to purge pages",e)}}import{z as E}from"zod";function Ot(t){return t.tool("send-email","Send email to a wiki user (requires authentication)",{username:E.string().describe("Username to email"),subject:E.string().describe("Email subject"),text:E.string().describe("Email content")},{title:"Send email",readOnlyHint:!1,destructiveHint:!1},async e=>_e(e))}async function _e(t){try{let e=await n(),o=await i(e,"sendEmail",t.username,t.subject,t.text);return l(o)}catch(e){return s("Failed to send email",e)}}import{z as H}from"zod";function Ut(t){return t.tool("upload","Upload a file to wiki (requires authentication)",{filename:H.string().describe("Destination filename on wiki"),content:H.string().describe("File content as base64 string"),comment:H.string().optional().describe("Upload comment")},{title:"Upload file",readOnlyHint:!1,destructiveHint:!1},async e=>Qe(e))}async function Qe(t){try{let e=await n(),o=Buffer.from(t.content,"base64"),r=t.comment?`[nodemw-mcp] ${t.comment}`:"[nodemw-mcp] File upload",a=await i(e,"upload",t.filename,o,r);return l(a)}catch(e){return s("Failed to upload file",e)}}import{z as I}from"zod";function zt(t){return t.tool("upload-by-url","Upload a file to wiki from URL (requires authentication)",{filename:I.string().describe("Destination filename on wiki"),url:I.string().url().describe("Source URL to download file from"),summary:I.string().optional().describe("Upload summary")},{title:"Upload file by URL",readOnlyHint:!1,destructiveHint:!1},async e=>Ve(e))}async function Ve(t){try{let e=await n(),o=t.summary?`[nodemw-mcp] ${t.summary}`:"[nodemw-mcp] File upload from URL",r=await i(e,"uploadByUrl",t.filename,t.url,o);return l(r)}catch(e){return s("Failed to upload file by URL",e)}}import{z as G}from"zod";function Wt(t){return t.tool("add-flow-topic","Add a new Flow topic to a wiki page (requires authentication)",{title:G.string().describe("Page title to add topic to"),subject:G.string().describe("Topic subject"),content:G.string().describe("Topic content in wikitext")},{title:"Add Flow topic",readOnlyHint:!1,destructiveHint:!1},async e=>Ye(e))}async function Ye(t){try{let e=await n(),o=await i(e,"addFlowTopic",t.title,t.subject,t.content);return l(o)}catch(e){return s("Failed to add Flow topic",e)}}import{z as $t}from"zod";function Nt(t){return t.tool("create-account","Create a new MediaWiki user account (requires authentication)",{username:$t.string().describe("New account username"),password:$t.string().describe("New account password")},{title:"Create user account",readOnlyHint:!1,destructiveHint:!1},async e=>Je(e))}async function Je(t){try{let e=await n(),o=await i(e,"createAccount",t.username,t.password);return l(o)}catch(e){return s("Failed to create account",e)}}var Lt=[D,_,Q,V,J,X,K,Z,tt,et,ot,rt,nt,it,st,lt,ct,pt,ut,gt,dt,ft,Tt,ht,xt,wt,kt,At,Mt,St,Ct],Xe=[Pt,jt,Bt,Et,It,Gt,Ft,Ot,Ut,zt,Wt,Nt];function Dt(t,e=!0){let o=e?[...Lt,...Xe]:Lt,r=[];for(let a of o)try{r.push(a(t))}catch(c){console.error(`Error registering tool: ${c.message}`)}return r}function to(){let{values:t,positionals:e}=Ze({options:{server:{type:"string",short:"s"},path:{type:"string"},endpoint:{type:"string"},user:{type:"string",short:"u"},pass:{type:"string",short:"p"},token:{type:"string"},"dry-run":{type:"boolean"}},strict:!1,allowPositionals:!0}),o=t.server??e[0]??process.env.NODEMW_MCP_SERVER;o||(console.error("Error: target server is required (-s, positional arg, or NODEMW_MCP_SERVER env)"),process.exit(1));let r,a,c;try{if(o.startsWith("http://")||o.startsWith("https://")){let u=new URL(o);r=u.hostname,a=u.protocol.replace(":",""),u.port&&(c=parseInt(u.port,10))}else r=o}catch{r=o}let m=process.env.NODEMW_MCP_ENDPOINT_PATH,p=!!(t.path??t.endpoint??m);return{config:{server:r,protocol:a,port:c,path:t.path??t.endpoint??m??"/w",username:t.user??process.env.NODEMW_MCP_MW_USER,password:t.pass??process.env.NODEMW_MCP_MW_PASS,token:t.token,dryRun:t["dry-run"]},pathExplicit:p}}async function eo(){let{config:t,pathExplicit:e}=to();if(!e)try{t.path=await $(t),console.error(`Auto-detected API path: ${t.path}`)}catch(p){console.error("Error:",p.message),process.exit(1)}z(t);try{await N(t)}catch(p){console.error("Error:",p.message),process.exit(1)}let o=n(),r;try{let u=(await i(o,"getSiteInfo",["general"]))?.general;u&&(r={sitename:u.sitename||"Unknown",base:u.base||"",generator:u.generator||"MediaWiki"})}catch{console.error("Warning: Could not fetch site info for server description.")}let a=L(),c=O(r,a);Dt(c,a);let m=new Ke;await c.connect(m)}eo().catch(console.error);
|
|
35
|
+
${JSON.stringify(m,null,2)}`:c}]}}else{let a=await s(r,"getArticle",e,t);return a==null?{content:[{type:"text",text:`Page "${e}" not found or has no content.`}],isError:!0}:{content:[{type:"text",text:a}]}}}catch(r){return{content:[{type:"text",text:`Error: ${r.message}`}],isError:!0}}}import{z as T}from"zod";function l(e){return{content:[{type:"text",text:JSON.stringify(e,null,2)}],structuredContent:e}}function i(e,t){return{content:[{type:"text",text:JSON.stringify({error:e,details:t?.message},null,2)}],isError:!0}}function lt(e){let t=e.tool("search","Search for wiki pages by keyword",{keyword:T.string().describe("Search keyword"),limit:T.number().optional().default(10).describe("Maximum number of results")},{title:"Search",readOnlyHint:!0,destructiveHint:!1},async({keyword:o,limit:r})=>ce(o,r));return t.update({outputSchema:{total:T.number(),limit:T.number(),keyword:T.string(),results:T.array(T.record(T.unknown()))}}),t}async function ce(e,t){try{let o=await n(),r=await s(o,"search",e),a=r.slice(0,t);return l({total:r.length,limit:t,keyword:e,results:a})}catch(o){return i("Failed to search",o)}}import{z as C}from"zod";function at(e){let t=e.tool("get-pages-in-category","Get all pages in a category",{category:C.string().describe("Category name (with or without Category: prefix)")},{title:"Get pages in category",readOnlyHint:!0,destructiveHint:!1},async({category:o})=>me(o));return t.update({outputSchema:{category:C.string(),pages:C.array(C.record(C.unknown())),count:C.number()}}),t}async function me(e){try{let t=await n(),o=e.replace(/^Category:/i,""),r=await s(t,"getPagesInCategory",o);return l({category:o,pages:r,count:r.length})}catch(t){return i("Failed to get pages in category",t)}}import{z as P}from"zod";function ct(e){let t=e.tool("get-categories","Get all categories matching a prefix",{prefix:P.string().optional().default("").describe("Prefix to filter categories")},{title:"Get categories",readOnlyHint:!0,destructiveHint:!1},async({prefix:o})=>pe(o));return t.update({outputSchema:{prefix:P.string(),categories:P.array(P.record(P.unknown())),count:P.number()}}),t}async function pe(e){try{let t=await n(),o=await s(t,"getCategories",e);return l({prefix:e,categories:o,count:o.length})}catch(t){return i("Failed to get categories",t)}}import{z as h}from"zod";function mt(e){let t=e.tool("get-users","Get all users matching a prefix",{prefix:h.string().optional().default("").describe("Prefix to filter usernames"),onlyWithEdits:h.boolean().optional().default(!1).describe("Only include users with at least one edit")},{title:"Get users",readOnlyHint:!0,destructiveHint:!1},async({prefix:o,onlyWithEdits:r})=>ue(o,r));return t.update({outputSchema:{prefix:h.string(),onlyWithEdits:h.boolean(),users:h.array(h.record(h.unknown())),count:h.number()}}),t}async function ue(e,t){try{let o=await n(),r=await s(o,"getUsers",{prefix:e,witheditsonly:t});return l({prefix:e,onlyWithEdits:t,users:r,count:r.length})}catch(o){return i("Failed to get users",o)}}import{z as A}from"zod";function pt(e){let t=e.tool("get-all-pages","Get all non-redirect pages from the wiki",{limit:A.number().optional().default(500).describe("Maximum number of pages to return")},{title:"Get all pages",readOnlyHint:!0,destructiveHint:!1},async({limit:o})=>de(o));return t.update({outputSchema:{total:A.number(),displayed:A.number(),pages:A.array(A.record(A.unknown())),limit:A.number()}}),t}async function de(e){try{let t=await n(),o=await s(t,"getAllPages"),r=o.slice(0,e);return l({total:o.length,displayed:r.length,pages:r,limit:e})}catch(t){return i("Failed to get all pages",t)}}import{z as j}from"zod";function ut(e){let t=e.tool("get-pages-in-namespace","Get all non-redirect pages in a specific namespace",{namespace:j.number().describe("Namespace number to filter pages")},{title:"Get pages in namespace",readOnlyHint:!0,destructiveHint:!1},async({namespace:o})=>ge(o));return t.update({outputSchema:{namespace:j.number(),pages:j.array(j.record(j.unknown())),count:j.number()}}),t}async function ge(e){try{let t=await n(),o=await s(t,"getPagesInNamespace",e);return l({namespace:e,pages:o,count:o.length})}catch(t){return i("Failed to get pages in namespace",t)}}import{z as B}from"zod";function dt(e){let t=e.tool("get-pages-by-prefix","Get pages starting with a specific prefix",{prefix:B.string().describe("Prefix to match page titles")},{title:"Get pages by prefix",readOnlyHint:!0,destructiveHint:!1},async({prefix:o})=>fe(o));return t.update({outputSchema:{prefix:B.string(),pages:B.array(B.record(B.unknown())),count:B.number()}}),t}async function fe(e){try{let t=await n(),o=await s(t,"getPagesByPrefix",e);return l({prefix:e,pages:o,count:o.length})}catch(t){return i("Failed to get pages by prefix",t)}}import{z as E}from"zod";function gt(e){let t=e.tool("get-pages-transcluding","Get all pages that transclude (include) a specific template",{template:E.string().describe("Template title to find transclusions")},{title:"Get pages transcluding template",readOnlyHint:!0,destructiveHint:!1},async({template:o})=>ye(o));return t.update({outputSchema:{template:E.string(),pages:E.array(E.record(E.unknown())),count:E.number()}}),t}async function ye(e){try{let t=await n(),r=(await s(t,"getPagesTranscluding",e))[1],a=Array.isArray(r)?r.filter(c=>c!=null&&typeof c=="object"&&"title"in c):[];return l({template:e,pages:a,count:a.length})}catch(t){return i("Failed to get pages transcluding template",t)}}import{z as R}from"zod";function ft(e){let t=e.tool("get-article-revisions","Get all revisions of a wiki article",{title:R.union([R.string(),R.number()]).describe("Article title or page ID")},{title:"Get article revisions",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>Te(o));return t.update({outputSchema:{title:R.string(),revisions:R.array(R.record(R.unknown())),count:R.number()}}),t}async function Te(e){try{let t=await n(),r=(await s(t,"getArticleRevisions",e)).flat();return l({title:e,revisions:r,count:r.length})}catch(t){return i("Failed to get article revisions",t)}}import{z as b}from"zod";function yt(e){let t=e.tool("get-article-categories","Get all categories that an article belongs to",{title:b.union([b.string(),b.number()]).describe("Article title or page ID")},{title:"Get article categories",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>he(o));return t.update({outputSchema:{title:b.string(),categories:b.array(b.record(b.unknown())),count:b.number()}}),t}async function he(e){try{let t=await n(),o=await s(t,"getArticleCategories",e);return l({title:e,categories:o,count:o.length})}catch(t){return i("Failed to get article categories",t)}}import{z as W}from"zod";function Tt(e){let t=e.tool("get-article-properties","Get page properties for a wiki article",{title:W.string().describe("Article title")},{title:"Get article properties",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>Re(o));return t.update({outputSchema:{title:W.string(),properties:W.record(W.unknown())}}),t}async function Re(e){try{let t=await n(),o=await s(t,"getArticleProperties",e);return l({title:e,properties:o})}catch(t){return i("Failed to get article properties",t)}}import{z as d}from"zod";function ht(e){let t=e.tool("get-article-info","Get detailed information about one or more articles",{title:d.union([d.string(),d.number(),d.array(d.union([d.string(),d.number()]))]).describe("Article title, page ID, or array of titles/IDs"),properties:d.array(d.string()).optional().describe("Specific properties to retrieve")},{title:"Get article info",readOnlyHint:!0,destructiveHint:!1},async({title:o,properties:r})=>be(o,r));return t.update({outputSchema:{title:d.string(),results:d.array(d.record(d.unknown())),count:d.number()}}),t}async function be(e,t){try{let o=await n(),a=await s(o,"getArticleInfo",e,t?{inprop:t}:{}),c=Array.isArray(a)?a:[a];return l({title:e,results:c,count:c.length})}catch(o){return i("Failed to get article info",o)}}import{z as f}from"zod";function Rt(e){let t=e.tool("get-user-contribs","Get contributions made by a specific user",{username:f.string().describe("Username to get contributions for"),namespace:f.number().optional().describe("Filter contributions by namespace"),limit:f.number().optional().default(50).describe("Maximum number of contributions to return")},{title:"Get user contributions",readOnlyHint:!0,destructiveHint:!1},async({username:o,namespace:r,limit:a})=>xe(o,r,a));return t.update({outputSchema:{username:f.string(),namespace:f.number(),limit:f.number(),total:f.number(),displayed:f.number(),contributions:f.array(f.record(f.unknown()))}}),t}async function xe(e,t,o=50){try{let r=await n(),a={user:e,...t!==void 0&&{namespace:t}},c=await s(r,"getUserContribs",a),m=Array.isArray(c[1])?c[1]:[],p=m.slice(0,o);return l({username:e,namespace:t,limit:o,total:m.length,displayed:p.length,contributions:p})}catch(r){return i("Failed to get user contributions",r)}}function bt(e){let t=e.tool("whoami","Get information about the currently logged in user",{},{title:"Who am I",readOnlyHint:!0,destructiveHint:!1},async()=>ve());return t.update({outputSchema:{}}),t}async function ve(){try{let e=await n(),t=await s(e,"whoami");return l(t)}catch(e){return i("Failed to get current user info",e)}}import{z as we}from"zod";function xt(e){let t=e.tool("whois","Get information about a specific user",{username:we.string().describe("Username to look up")},{title:"Whois",readOnlyHint:!0,destructiveHint:!1},async({username:o})=>ke(o));return t.update({outputSchema:{}}),t}async function ke(e){try{let t=await n(),o=await s(t,"whois",e);return o.missing?i(`User "${e}" not found.`):l(o)}catch(t){return i("Failed to get user info",t)}}import{z as vt}from"zod";function wt(e){let t=e.tool("whoare","Get information about multiple wiki users",{usernames:vt.array(vt.string()).describe("Array of usernames to query")},{title:"Who are",readOnlyHint:!0,destructiveHint:!1},async o=>Se(o));return t.update({outputSchema:{}}),t}async function Se(e){try{let t=await n(),o=await s(t,"whoare",e.usernames);return l(o)}catch(t){return i("Failed to get user information",t)}}import{z as x}from"zod";function kt(e){let t=e.tool("get-images","Get list of images starting from a specific name",{startFrom:x.string().optional().default("").describe("Start from this image name"),limit:x.number().optional().default(50).describe("Maximum number of images to return")},{title:"Get images",readOnlyHint:!0,destructiveHint:!1},async({startFrom:o,limit:r})=>Ae(o,r));return t.update({outputSchema:{total:x.number(),limit:x.number(),startFrom:x.string(),images:x.array(x.record(x.unknown()))}}),t}async function Ae(e,t){try{let o=await n(),r=await new Promise((c,m)=>{o.getImages(e,(p,...u)=>{if(p)m(p);else{let g=u[0];c(Array.isArray(g)?g:[])}})}),a=r.slice(0,t);return l({total:r.length,limit:t,startFrom:e,images:a})}catch(o){return i("Failed to get images",o)}}import{z as v}from"zod";function St(e){let t=e.tool("get-images-from-article","Get all images embedded in a specific article",{title:v.union([v.string(),v.number()]).describe("Article title or page ID")},{title:"Get images from article",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>Me(o));return t.update({outputSchema:{title:v.string(),images:v.array(v.record(v.unknown())),count:v.number()}}),t}async function Me(e){try{let t=await n(),o=await s(t,"getImagesFromArticle",e);return l({title:e,images:o,count:o.length})}catch(t){return i("Failed to get images from article",t)}}import{z as H}from"zod";function At(e){let t=e.tool("get-image-usage","Get all pages that use a specific image",{filename:H.string().describe("Image filename with File: prefix")},{title:"Get image usage",readOnlyHint:!0,destructiveHint:!1},async({filename:o})=>Ce(o));return t.update({outputSchema:{filename:H.string(),pages:H.array(H.record(H.unknown())),count:H.number()}}),t}async function Ce(e){try{let t=await n(),o=await s(t,"getImageUsage",e);return l({filename:e,pages:o,count:o.length})}catch(t){return i("Failed to get image usage",t)}}import{z as $}from"zod";function Mt(e){let t=e.tool("get-image-info","Get detailed information about an image file",{filename:$.string().describe("Image filename with File: prefix")},{title:"Get image info",readOnlyHint:!0,destructiveHint:!1},async({filename:o})=>Pe(o));return t.update({outputSchema:{filename:$.string(),info:$.record($.unknown())}}),t}async function Pe(e){try{let t=await n(),o=await s(t,"getImageInfo",e);return o?l({filename:e,info:o}):i(`Image "${e}" not found.`)}catch(t){return i("Failed to get image info",t)}}import{z as y}from"zod";function Ct(e){let t=e.tool("get-log","Get log entries of a specific type",{type:y.string().describe("Log type (e.g. delete, block, move)"),start:y.string().optional().default("").describe("Start timestamp (YYYYMMDDHHMMSS format)"),limit:y.number().optional().default(50).describe("Maximum number of entries to return")},{title:"Get log entries",readOnlyHint:!0,destructiveHint:!1},async({type:o,start:r,limit:a})=>je(o,r,a));return t.update({outputSchema:{type:y.string(),start:y.string(),limit:y.number(),total:y.number(),displayed:y.number(),entries:y.array(y.record(y.unknown()))}}),t}async function je(e,t,o){try{let r=await n(),a=await new Promise((m,p)=>{r.getLog(e,t,(u,...g)=>{if(u)p(u);else{let M=g[0];m(Array.isArray(M)?M:[])}})}),c=a.slice(0,o);return l({type:e,start:t,limit:o,total:a.length,displayed:c.length,entries:c})}catch(r){return i("Failed to get log entries",r)}}import{z as Pt}from"zod";function jt(e){return e.tool("expand-templates","Expand templates in wikitext",{text:Pt.string().describe("Wikitext with templates to expand"),title:Pt.string().optional().describe("Context page title")},{title:"Expand templates",readOnlyHint:!0,destructiveHint:!1},async({text:t,title:o})=>Be(t,o))}async function Be(e,t){try{let o=await n(),r=await s(o,"expandTemplates",e,t||"");return r==null?{content:[{type:"text",text:`Failed to expand templates for "${e}".`}],isError:!0}:{content:[{type:"text",text:r}]}}catch(o){return{content:[{type:"text",text:`Error: ${o.message}`}],isError:!0}}}import{z as Bt}from"zod";function Et(e){return e.tool("parse","Parse wikitext to HTML",{text:Bt.string().describe("Wikitext to parse"),title:Bt.string().optional().describe("Context page title")},{title:"Parse wikitext",readOnlyHint:!0,destructiveHint:!1},async({text:t,title:o})=>Ee(t,o))}async function Ee(e,t){try{let o=await n(),r=await s(o,"parse",e,t||""),a=r[1]||"",c=Array.isArray(r[2])?r[2]:[];return{content:[{type:"text",text:["Parsed XML structure:","",a,"",`Images found: ${c.length>0?c.join(", "):"none"}`].join(`
|
|
36
|
+
`)}]}}catch(o){return{content:[{type:"text",text:`Error: ${o.message}`}],isError:!0}}}import{z as w}from"zod";function Ht(e){let t=e.tool("get-recent-changes","Get recent changes on the wiki",{start:w.string().optional().describe("Start timestamp"),limit:w.number().optional().default(50).describe("Maximum number of changes to return")},{title:"Get recent changes",readOnlyHint:!0,destructiveHint:!1},async({start:o,limit:r})=>He(o,r));return t.update({outputSchema:{total:w.number(),limit:w.number(),start:w.string(),changes:w.array(w.record(w.unknown()))}}),t}async function He(e,t=50){try{let o=await n(),r=await new Promise((c,m)=>{o.getRecentChanges(e,(p,...u)=>{if(p)m(p);else{let g=u[0];c(Array.isArray(g)?g:[])}})}),a=r.slice(0,t);return l({total:r.length,limit:t,start:e,changes:a})}catch(o){return i("Failed to get recent changes",o)}}import{z as It}from"zod";function Gt(e){let t=e.tool("get-site-info","Get site information from MediaWiki",{properties:It.array(It.string()).describe("List of site information properties to retrieve")},{title:"Get site info",readOnlyHint:!0,destructiveHint:!1},async({properties:o})=>Ie(o));return t.update({outputSchema:{}}),t}async function Ie(e){try{let t=await n(),o=await s(t,"getSiteInfo",e);return l(o||{})}catch(t){return i("Failed to get site info",t)}}function Ft(e){let t=e.tool("get-site-stats","Get site statistics",{},{title:"Get site stats",readOnlyHint:!0,destructiveHint:!1},async()=>Ge());return t.update({outputSchema:{}}),t}async function Ge(){try{let e=await n(),t=await s(e,"getSiteStats");return l(t)}catch(e){return i("Failed to get site stats",e)}}function Ot(e){let t=e.tool("get-mediawiki-version","Get MediaWiki version running on the server",{},{title:"Get MediaWiki version",readOnlyHint:!0,destructiveHint:!1},async()=>Fe());return t.update({outputSchema:{version:z.string()}}),t}async function Fe(){try{let e=await n(),t=await s(e,"getMediaWikiVersion");return l({version:t})}catch(e){return i("Failed to get MediaWiki version",e)}}import{z as I}from"zod";function Ut(e){let t=e.tool("get-query-page","Get results from a query page (special page)",{name:I.string().describe("Name of the query page")},{title:"Get query page results",readOnlyHint:!0,destructiveHint:!1},async({name:o})=>Oe(o));return t.update({outputSchema:{name:I.string(),results:I.array(I.record(I.unknown())),count:I.number()}}),t}async function Oe(e){try{let t=await n(),o=await s(t,"getQueryPage",e);return l({name:e,results:o,count:o.length})}catch(t){return i("Failed to get query page results",t)}}import{z as k}from"zod";function zt(e){let t=e.tool("get-external-links","Get all external links from an article",{title:k.union([k.string(),k.number()]).describe("Article title or page ID")},{title:"Get external links",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>Ue(o));return t.update({outputSchema:{title:k.string(),links:k.array(k.record(k.unknown())),count:k.number()}}),t}async function Ue(e){try{let t=await n(),o=await s(t,"getExternalLinks",e);return l({title:e,links:o.map(r=>r["*"]),count:o.length})}catch(t){return i("Failed to get external links",t)}}import{z as G}from"zod";function Wt(e){let t=e.tool("get-backlinks","Get all backlinks to a specific page",{title:G.string().describe("Target page title to find backlinks for")},{title:"Get backlinks",readOnlyHint:!0,destructiveHint:!1},async({title:o})=>ze(o));return t.update({outputSchema:{target:G.string(),backlinks:G.array(G.record(G.unknown())),count:G.number()}}),t}async function ze(e){try{let t=await n(),o=await s(t,"getBacklinks",e);return l({target:e,backlinks:o,count:o.length})}catch(t){return i("Failed to get backlinks",t)}}import{z as N}from"zod";function $t(e){let t=e.tool("edit","Edit a wiki page (requires authentication)",{title:N.string().describe("Page title to edit"),content:N.string().describe("New content for the page"),summary:N.string().describe("Edit summary"),minor:N.boolean().optional().default(!1).describe("Mark as minor edit")},{title:"Edit page",readOnlyHint:!1,destructiveHint:!0},async o=>We(o));return t.update({outputSchema:{}}),t}async function We(e){try{let t=await n(),o=`[nodemw-mcp] ${e.summary}`,r=await s(t,"edit",e.title,e.content,o,e.minor||!1);return l(r)}catch(t){return i("Failed to edit page",t)}}import{z as O}from"zod";function Nt(e){let t=e.tool("append","Append content to a wiki page (requires authentication)",{title:O.string().describe("Page title"),content:O.string().describe("Content to append"),summary:O.string().describe("Edit summary")},{title:"Append to page",readOnlyHint:!1,destructiveHint:!0},async o=>$e(o));return t.update({outputSchema:{success:O.boolean(),title:O.string()}}),t}async function $e(e){try{let t=await n(),o=`[nodemw-mcp] ${e.summary}`;return await s(t,"append",e.title,e.content,o),l({success:!0,title:e.title})}catch(t){return i("Failed to append to page",t)}}import{z as _}from"zod";function Lt(e){let t=e.tool("prepend","Prepend content to a wiki page (requires authentication)",{title:_.string().describe("Page title to prepend to"),content:_.string().describe("Content to prepend"),summary:_.string().describe("Edit summary")},{title:"Prepend to page",readOnlyHint:!1,destructiveHint:!0},async o=>Ne(o));return t.update({outputSchema:{}}),t}async function Ne(e){try{let t=await n(),o=`[nodemw-mcp] ${e.summary}`,r=await s(t,"prepend",e.title,e.content,o);return l(r)}catch(t){return i("Failed to prepend to page",t)}}import{z as Q}from"zod";function Dt(e){let t=e.tool("move","Move (rename) a wiki page (requires authentication)",{from:Q.string().describe("Current page title"),to:Q.string().describe("New page title"),summary:Q.string().describe("Move summary")},{title:"Move page",readOnlyHint:!1,destructiveHint:!0},async o=>Le(o));return t.update({outputSchema:{}}),t}async function Le(e){try{let t=await n(),o=`[nodemw-mcp] ${e.summary}`,r=await s(t,"move",e.from,e.to,o);return l(r)}catch(t){return i("Failed to move page",t)}}import{z as qt}from"zod";function _t(e){let t=e.tool("delete","Delete a wiki page (requires authentication)",{title:qt.string().describe("Page title to delete"),reason:qt.string().describe("Reason for deletion")},{title:"Delete page",readOnlyHint:!1,destructiveHint:!0},async o=>De(o));return t.update({outputSchema:{}}),t}async function De(e){try{let t=await n(),o=`[nodemw-mcp] ${e.reason}`,r=await s(t,"delete",e.title,o);return l(r)}catch(t){return i("Failed to delete page",t)}}import{z as S}from"zod";function Qt(e){let t=e.tool("protect","Protect a wiki page (requires authentication)",{title:S.string().describe("Page title to protect"),protections:S.array(S.object({type:S.string().describe("Action type (e.g., edit, move)"),level:S.string().optional().default("all").describe("Protection level (e.g., sysop, autoconfirmed)"),expiry:S.string().optional().describe("Expiry time (e.g., 1 week, never)")})).describe("Protection settings"),reason:S.string().optional().describe("Reason for protection"),cascade:S.boolean().optional().default(!1).describe("Apply cascade protection")},{title:"Protect page",readOnlyHint:!1,destructiveHint:!0},async o=>qe(o));return t.update({outputSchema:{}}),t}async function qe(e){try{let t=await n(),o={};e.reason&&(o.reason=`[nodemw-mcp] ${e.reason}`),e.cascade&&(o.cascade=e.cascade);let r=await s(t,"protect",e.title,e.protections,o);return l(r)}catch(t){return i("Failed to protect page",t)}}import{z as L}from"zod";function Vt(e){let t=e.tool("purge","Purge cache for wiki pages",{titles:L.union([L.string(),L.array(L.string())]).describe("Page title(s) or category to purge")},{title:"Purge pages",readOnlyHint:!1,destructiveHint:!1},async o=>_e(o));return t.update({outputSchema:{}}),t}async function _e(e){try{let t=await n(),o=await s(t,"purge",e.titles);return l(o)}catch(t){return i("Failed to purge pages",t)}}import{z as V}from"zod";function Yt(e){let t=e.tool("send-email","Send email to a wiki user (requires authentication)",{username:V.string().describe("Username to email"),subject:V.string().describe("Email subject"),text:V.string().describe("Email content")},{title:"Send email",readOnlyHint:!1,destructiveHint:!1},async o=>Qe(o));return t.update({outputSchema:{}}),t}async function Qe(e){try{let t=await n(),o=await s(t,"sendEmail",e.username,e.subject,e.text);return l(o)}catch(t){return i("Failed to send email",t)}}import{z as Y}from"zod";function Jt(e){let t=e.tool("upload","Upload a file to wiki (requires authentication)",{filename:Y.string().describe("Destination filename on wiki"),content:Y.string().describe("File content as base64 string"),comment:Y.string().optional().describe("Upload comment")},{title:"Upload file",readOnlyHint:!1,destructiveHint:!1},async o=>Ve(o));return t.update({outputSchema:{}}),t}async function Ve(e){try{let t=await n(),o=Buffer.from(e.content,"base64"),r=e.comment?`[nodemw-mcp] ${e.comment}`:"[nodemw-mcp] File upload",a=await s(t,"upload",e.filename,o,r);return l(a)}catch(t){return i("Failed to upload file",t)}}import{z as J}from"zod";function Xt(e){let t=e.tool("upload-by-url","Upload a file to wiki from URL (requires authentication)",{filename:J.string().describe("Destination filename on wiki"),url:J.string().url().describe("Source URL to download file from"),summary:J.string().optional().describe("Upload summary")},{title:"Upload file by URL",readOnlyHint:!1,destructiveHint:!1},async o=>Ye(o));return t.update({outputSchema:{}}),t}async function Ye(e){try{let t=await n(),o=e.summary?`[nodemw-mcp] ${e.summary}`:"[nodemw-mcp] File upload from URL",r=await s(t,"uploadByUrl",e.filename,e.url,o);return l(r)}catch(t){return i("Failed to upload file by URL",t)}}import{z as X}from"zod";function Kt(e){let t=e.tool("add-flow-topic","Add a new Flow topic to a wiki page (requires authentication)",{title:X.string().describe("Page title to add topic to"),subject:X.string().describe("Topic subject"),content:X.string().describe("Topic content in wikitext")},{title:"Add Flow topic",readOnlyHint:!1,destructiveHint:!1},async o=>Je(o));return t.update({outputSchema:{}}),t}async function Je(e){try{let t=await n(),o=await s(t,"addFlowTopic",e.title,e.subject,e.content);return l(o)}catch(t){return i("Failed to add Flow topic",t)}}import{z as Zt}from"zod";function te(e){let t=e.tool("create-account","Create a new MediaWiki user account (requires authentication)",{username:Zt.string().describe("New account username"),password:Zt.string().describe("New account password")},{title:"Create user account",readOnlyHint:!1,destructiveHint:!1},async o=>Xe(o));return t.update({outputSchema:{}}),t}async function Xe(e){try{let t=await n(),o=await s(t,"createAccount",e.username,e.password);return l(o)}catch(t){return i("Failed to create account",t)}}var ee=[it,lt,at,ct,mt,pt,ut,dt,gt,ft,yt,Tt,ht,Rt,bt,xt,wt,kt,St,At,Mt,Ct,jt,Et,Ht,Gt,Ft,Ot,Ut,zt,Wt],Ke=[$t,Nt,Lt,Dt,_t,Qt,Vt,Yt,Jt,Xt,Kt,te];function oe(e,t=!0){let o=t?[...ee,...Ke]:ee,r=[];for(let a of o)try{r.push(a(e))}catch(c){console.error(`Error registering tool: ${c.message}`)}return r}function eo(){let{values:e,positionals:t}=to({options:{server:{type:"string",short:"s"},path:{type:"string"},endpoint:{type:"string"},user:{type:"string",short:"u"},pass:{type:"string",short:"p"},token:{type:"string"},"dry-run":{type:"boolean"}},strict:!1,allowPositionals:!0}),o=e.server??t[0]??process.env.NODEMW_MCP_SERVER;o||(console.error("Error: target server is required (-s, positional arg, or NODEMW_MCP_SERVER env)"),process.exit(1));let r,a,c;try{if(o.startsWith("http://")||o.startsWith("https://")){let u=new URL(o);r=u.hostname,a=u.protocol.replace(":",""),u.port&&(c=parseInt(u.port,10))}else r=o}catch{r=o}let m=process.env.NODEMW_MCP_ENDPOINT_PATH,p=!!(e.path??e.endpoint??m);return{config:{server:r,protocol:a,port:c,path:e.path??e.endpoint??m??"/w",username:e.user??process.env.NODEMW_MCP_MW_USER,password:e.pass??process.env.NODEMW_MCP_MW_PASS,token:e.token,dryRun:e["dry-run"]},pathExplicit:p}}async function oo(){let{config:e,pathExplicit:t}=eo();if(!t)try{e.path=await rt(e),console.error(`Auto-detected API path: ${e.path}`)}catch(p){console.error("Error:",p.message),process.exit(1)}et(e);try{await nt(e)}catch(p){console.error("Error:",p.message),process.exit(1)}let o=n(),r;try{let u=(await s(o,"getSiteInfo",["general"]))?.general;u&&(r={sitename:u.sitename||"Unknown",base:u.base||"",generator:u.generator||"MediaWiki"})}catch{console.error("Warning: Could not fetch site info for server description.")}let a=st(),c=Z(r,a);oe(c,a);let m=new Ze;await c.connect(m)}oo().catch(console.error);
|
|
37
37
|
//# sourceMappingURL=index.js.map
|