Class: Mcp::Tools::CustomService

Inherits:
BaseService show all
Extended by:
Gitlab::Utils::Override
Includes:
Mcp::Tools::Concerns::ResourceFinder, Mcp::Tools::Concerns::Versionable
Defined in:
app/services/mcp/tools/custom_service.rb

Direct Known Subclasses

GetServerVersionService

Constant Summary

Constants included from Mcp::Tools::Concerns::Versionable

Mcp::Tools::Concerns::Versionable::VERSION_FORMAT

Instance Method Summary collapse

Methods included from Gitlab::Utils::Override

extended, extensions, included, method_added, override, prepended, queue_verification, verify!

Methods included from Mcp::Tools::Concerns::Versionable

#description, #graphql_operation, #initialize_version, #input_schema, #operation_name, #version

Methods inherited from BaseService

#available?, #description, #input_schema, #to_h, tool_aliases

Constructor Details

#initialize(name:, version: nil) ⇒ CustomService

Returns a new instance of CustomService.



11
12
13
14
# File 'app/services/mcp/tools/custom_service.rb', line 11

def initialize(name:, version: nil)
  super(name: name)
  initialize_version(version)
end

Instance Method Details

#auth_abilityObject

Raises:

  • (NoMethodError)


43
44
45
# File 'app/services/mcp/tools/custom_service.rb', line 43

def auth_ability
  raise NoMethodError, "#{self.class.name}#auth_ability should be implemented in a subclass"
end

#auth_target(_params) ⇒ Object

Raises:

  • (NoMethodError)


47
48
49
# File 'app/services/mcp/tools/custom_service.rb', line 47

def auth_target(_params)
  raise NoMethodError, "#{self.class.name}#auth_target should be implemented in a subclass"
end

#authorize!(params) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
# File 'app/services/mcp/tools/custom_service.rb', line 32

def authorize!(params)
  target = auth_target(params)
  raise ArgumentError, "#{name}: target object not found, the params received: #{params.inspect}" if target.nil?

  allowed = ::Ability.allowed?(current_user, auth_ability, target)
  return if allowed

  raise Gitlab::Access::AccessDeniedError, "CustomService: User #{current_user.id} does " \
    "not have permission to #{auth_ability} for target #{target.id}"
end

#execute(request: nil, params: nil) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'app/services/mcp/tools/custom_service.rb', line 22

def execute(request: nil, params: nil)
  return Response.error("#{self.class.name}: current_user is not set") unless current_user.present?

  authorize!(params)

  super
rescue StandardError => e
  Response.error("Tool execution failed: #{e.message}")
end

#set_cred(current_user: nil, access_token: nil) ⇒ Object



17
18
19
20
# File 'app/services/mcp/tools/custom_service.rb', line 17

def set_cred(current_user: nil, access_token: nil)
  @current_user = current_user
  _ = access_token # access_token is not used in CustomService
end