| GET | /assistant/mcp/usage | Get the public MCP server token usage and limit for a company | Returns how many tokens the company has consumed in the current rolling window through the public MCP server it connects to external AI clients, the configured limit and whether the company is still within budget. Metered separately from the admin AI assistant. Defaults to the logged-in user's company when no CompanyId is supplied. |
|---|
<?php namespace dtos;
use DateTime;
use Exception;
use DateInterval;
use JsonSerializable;
use ServiceStack\{IReturn,IReturnVoid,IGet,IPost,IPut,IDelete,IPatch,IMeta,IHasSessionId,IHasBearerToken,IHasVersion};
use ServiceStack\{ICrud,ICreateDb,IUpdateDb,IPatchDb,IDeleteDb,ISaveDb,AuditBase,QueryDb,QueryDb2,QueryData,QueryData2,QueryResponse};
use ServiceStack\{ResponseStatus,ResponseError,EmptyResponse,IdResponse,ArrayList,KeyValuePair2,StringResponse,StringsResponse,Tuple2,Tuple3,ByteArray};
use ServiceStack\{JsonConverters,Returns,TypeContext};
class AiChatUsageResponse implements JsonSerializable
{
public function __construct(
/** @description The company the usage applies to. */
// @ApiMember(Description="The company the usage applies to.")
/** @var string */
public string $CompanyId='',
/** @description Tokens consumed within the current rolling window. */
// @ApiMember(Description="Tokens consumed within the current rolling window.")
/** @var int */
public int $TokensUsed=0,
/** @description The company's token limit for the window. */
// @ApiMember(Description="The company's token limit for the window.")
/** @var int */
public int $TokenLimit=0,
/** @description Tokens remaining before the limit is reached (never negative). */
// @ApiMember(Description="Tokens remaining before the limit is reached (never negative).")
/** @var int */
public int $TokensRemaining=0,
/** @description True while the company is still below its token limit. */
// @ApiMember(Description="True while the company is still below its token limit.")
/** @var bool|null */
public ?bool $IsWithinBudget=null,
/** @description Length of the rolling usage window, in days. */
// @ApiMember(Description="Length of the rolling usage window, in days.")
/** @var int */
public int $WindowDays=0,
/** @var ResponseStatus|null */
public ?ResponseStatus $ResponseStatus=null
) {
}
/** @throws Exception */
public function fromMap($o): void {
if (isset($o['CompanyId'])) $this->CompanyId = $o['CompanyId'];
if (isset($o['TokensUsed'])) $this->TokensUsed = $o['TokensUsed'];
if (isset($o['TokenLimit'])) $this->TokenLimit = $o['TokenLimit'];
if (isset($o['TokensRemaining'])) $this->TokensRemaining = $o['TokensRemaining'];
if (isset($o['IsWithinBudget'])) $this->IsWithinBudget = $o['IsWithinBudget'];
if (isset($o['WindowDays'])) $this->WindowDays = $o['WindowDays'];
if (isset($o['ResponseStatus'])) $this->ResponseStatus = JsonConverters::from('ResponseStatus', $o['ResponseStatus']);
}
/** @throws Exception */
public function jsonSerialize(): mixed
{
$o = [];
if (isset($this->CompanyId)) $o['CompanyId'] = $this->CompanyId;
if (isset($this->TokensUsed)) $o['TokensUsed'] = $this->TokensUsed;
if (isset($this->TokenLimit)) $o['TokenLimit'] = $this->TokenLimit;
if (isset($this->TokensRemaining)) $o['TokensRemaining'] = $this->TokensRemaining;
if (isset($this->IsWithinBudget)) $o['IsWithinBudget'] = $this->IsWithinBudget;
if (isset($this->WindowDays)) $o['WindowDays'] = $this->WindowDays;
if (isset($this->ResponseStatus)) $o['ResponseStatus'] = JsonConverters::to('ResponseStatus', $this->ResponseStatus);
return empty($o) ? new class(){} : $o;
}
}
// @ApiResponse(Description="You were unauthorized to call this service", StatusCode=401)
// @ValidateRequest(Validator="IsAuthenticated")
class GetMcpUsage implements ICompany, JsonSerializable
{
public function __construct(
/** @description The company id. Defaults to the logged-in user's company when omitted. */
// @ApiMember(DataType="string", Description="The company id. Defaults to the logged-in user's company when omitted.", ParameterType="query")
/** @var string|null */
public ?string $CompanyId=null
) {
}
/** @throws Exception */
public function fromMap($o): void {
if (isset($o['CompanyId'])) $this->CompanyId = $o['CompanyId'];
}
/** @throws Exception */
public function jsonSerialize(): mixed
{
$o = [];
if (isset($this->CompanyId)) $o['CompanyId'] = $this->CompanyId;
return empty($o) ? new class(){} : $o;
}
}
To override the Content-type in your clients, use the HTTP Accept Header, append the .csv suffix or ?format=csv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
GET /assistant/mcp/usage HTTP/1.1 Host: testapi.bokamera.se Accept: text/csv
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Length: length
{"TokensUsed":0,"TokenLimit":0,"TokensRemaining":0,"IsWithinBudget":false,"WindowDays":0,"ResponseStatus":{"ErrorCode":"String","Message":"String","StackTrace":"String","Errors":[{"ErrorCode":"String","FieldName":"String","Message":"String","Meta":{"String":"String"}}],"Meta":{"String":"String"}}}