Class ::nsmcp::Protocol
::nsmcp::Protocol
create ... \
[ -authorizer:required authorizer:required ] \
[ -registry:required registry:required ] \
[ -versions (default "2025-03-26 2025-06-18 2025-11-25") ]
Defined in /usr/local/ns/tcl/nsmcp/lib/protocol.tclClass Relations
- class: ::nx::Class
![[i]](/resources/acs-subsite/ZoomIn16.gif)
- superclass: ::nx::Object
![[i]](/resources/acs-subsite/ZoomIn16.gif)
::nx::Class create ::nsmcp::Protocol \
-superclass ::nx::Object
Methods (to be applied on instances)
dispatch (scripted, public)
<instance of nsmcp::Protocol
> dispatch context method params
- Parameters:
- context (required)
- method (required)
- params (required)
- Testcases:
-
No testcase defined.
switch -- $method {
initialize {
set requested [:parameter $params protocolVersion string]
:parameter $params capabilities object
set client [list {} object [:parameter $params clientInfo object]]
:parameter $client name string
:parameter $client version string
set version [expr {[:supports $requested] ? $requested : [lindex ${:versions} end]}]
return [list {} object [list protocolVersion string $version capabilities object {tools object {listChanged boolean false}} serverInfo object {name string nsmcp version string 0.1}]]
}
ping {return {{} object {}}}
tools/list {
if {![catch {ns_json triples gettype -path cursor -- $params}]} {
return -code error -errorcode {NSMCP RPC -32602} "Pagination is not available"
}
return [${:registry} list $context ${:authorizer}]
}
tools/call {
set name [:parameter $params name string]
set arguments {{} object {}}
if {![catch {ns_json triples gettype -path arguments -- $params}]} {
set arguments [list {} object [:parameter $params arguments object]]
}
return [${:registry} call $context ${:authorizer} $name $arguments]
}
default {
return -code error -errorcode {NSMCP RPC -32601} "Method not found"
}
}error (scripted, public)
<instance of nsmcp::Protocol
> error id code message
- Parameters:
- id (required)
- code (required)
- message (required)
- Testcases:
-
No testcase defined.
return [ns_json value -- [list {} object [list jsonrpc string 2.0 id [lindex $id 1] [lindex $id 2] error object [list code number $code message string $message]]]]handle (scripted, public)
<instance of nsmcp::Protocol
> handle context body
- Parameters:
- context (required)
- body (required)
- Testcases:
-
No testcase defined.
set null {{} null {}}
if {[catch {
ns_json parse -maxdepth 32 -maxstring 65536 -maxcontainer 256 -validatenumbers -output triples -- $body
} request]} {
return [dict create status 400 body [:error $null -32700 "Parse error"]]
}
set id $null
set hasId 0
if {[catch {
:uniqueMembers $request
if {[lindex $request 1] ne "object"} {error "expected object"}
set hasId [expr {![catch {ns_json triples gettype -path id -- $request} idType]}]
if {$hasId} {
set id [list {} $idType [:parameter $request id {string number}]]
}
if {[:parameter $request jsonrpc string] ne "2.0"} {error "invalid JSON-RPC version"}
set method [:parameter $request method string]
set params {{} object {}}
if {![catch {ns_json triples gettype -path params -- $request}]} {
set params [list {} object [:parameter $request params object]]
}
}]} {
return [dict create status 400 body [:error $null -32600 "Invalid request"]]
}
if {!$hasId} {
return [dict create status 202 body {}]
}
if {[catch {:dispatch $context $method $params} result options]} {
set code -32603; set message "Internal error"
set ec [dict get $options -errorcode]
if {[lrange $ec 0 1] eq {NSMCP RPC}} {
set code [lindex $ec 2]; set message $result
}
return [dict create status 200 body [:error $id $code $message]]
}
return [dict create status 200 body [ns_json value -- [list {} object [list jsonrpc string 2.0 id [lindex $id 1] [lindex $id 2] result object [lindex $result 2]]]]]supports (scripted, public)
<instance of nsmcp::Protocol
> supports version
- Parameters:
- version (required)
- Testcases:
-
No testcase defined.
return [expr {$version in ${:versions}}]